是否可以完全清空远程Git存储库?

时间:2011-02-07 13:58:19

标签: git

假设我在第一次推送到远程Git存储库时犯了一个错误。我可以以某种方式还原这个,以便存储库回到它的初始状态?我无法访问远程计算机,因此无法删除.git目录。

问题是,据我所知,你不能“解开”头部。

这就是我(或实际上是问过这个问题的同事)做的事情(我在这里做了一个本地的“远程”回购,所以任何人都可以测试一下):

mkdir git-remote
cd git-remote
git init --bare
cd ..
mkdir git-local
cd git-local
git clone ../git-remote .
touch a
git add a
git commit -m "initial"
git push origin master

此时他意识到他把错误的东西推到了远程存储库。

我唯一的想法是删除他的回购和放大器中的所有内容。 git rm&& git push仍会在那里留下错误的提交,但文件不会打扰第二次推送。

5 个答案:

答案 0 :(得分:63)

我认为你可能有XY问题。您实际上并不需要让远程存储库恢复到其原始状态才能重新开始;你只需要在本地重新开始,然后强制推送到遥控器。

# create a new repository that has the initial commit that you want
mkdir foo; cd foo; git init; ...; git commit

# set up a remote
git remote add origin <url-of-remote>
git branch --set-upstream master origin/master

# push your new history
git push -f

# delete obsolete remote branches
git push origin :deprecated-branch

远程存储库永远不会返回到no-commits状态,但它会在你想要的地方结束,而这一切都很重要!

(在引擎盖下,旧的提交实际上仍然在远程存储库中,但是它们是悬空的,没有任何引用指向它们。当推送触发git gc --auto时,它们将被自动删除在某些时候。)

如果您确实想要因某种原因清空它,可以在远程存储库中设置receive.denyDeleteCurrent,并推送删除所有分支,包括当前分支。不过,我不明白为什么你真的需要!

答案 1 :(得分:1)

当你说“第一次推”时,你的意思是第一次推向分支机构吗?因为在推到它之前根本没有代码。如果是这样的话......

如果您想第一次将本地分支 foo 推送到远程分支,您可以这样做:

git push origin foo:foo

为了删除远程分支 foo ,你告诉git向它推送“nothing”:

git push origin :foo

现在你可以随心所欲地重新开始。

老实说,我不确定服务器上实际存在什么 - 但就完全重置分支历史而言,这将有效。

(fwiw,我认为这个界面非常荒谬)

答案 2 :(得分:1)

清空GitHub存储库的最佳方法。

步骤1:创建新分支。 git checkout -b master1

第2步:。将数据添加到其中。

git add .

git commit -m "Initial commit"

git push origin master1

步骤3:现在删除旧的master分支。

git push origin --delete <your_branch>

答案 3 :(得分:1)

下面的步骤很容易做到,请谨慎进行主备份,以备不时之需。

mkdir  reset
cd reset
 git init
 touch README.md
 git add .
 git commit -m 'Initial commit'
 git remote add origin git@github.com:XXX/xxx.git
 git push --force --set-upstream origin master

答案 4 :(得分:-3)

您可以git revert提交,例如git revert HEAD

请记住,您提交的内容将驻留在.git目录中。 (你不能做任何事情)

如果没有访问.git目录,就无法从历史记录删除提交。