假设我在第一次推送到远程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仍会在那里留下错误的提交,但文件不会打扰第二次推送。
答案 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
目录,就无法从历史记录删除提交。