如何撤消git pull或git push?

时间:2014-01-29 17:00:14

标签: git

我经常使用git,但我对引擎盖下的细节和“git语言”没有非常深刻的理解......

我有两个目录:一个在我的电脑上,一个在我的笔记本电脑上。 两者都包含一个.git存储库(不是裸的!)。

我的笔记本电脑通过ssh连接到我的电脑,从笔记本电脑连接到电脑(添加了ssh遥控器)。

因为我无法推送到已检出的分支机构(在笔记本电脑的电脑上),我在电脑上有两个分支机构(主机和笔记本电脑主机)。 所以我推,然后在电脑上合并分支。

在某种程度上,我搞砸了正确的订单而且我有冲突。

我正在尝试使用git log,git diff(和gitk)进行清理。

为了撤消我使用过的合并

 git reset --merge

这个命令有危险吗?

如何撤消对遥控器的拉动或推动?

我是否需要一个“中央”存储库来避免冲突(我认为这意味着一个裸存储库)?

为什么无法推送到已检出的遥控器上的分支? 我可以用一些不危险的方式强制执行此操作吗?

每个提示都很好...... 感谢

2 个答案:

答案 0 :(得分:2)

撤消对远程存储库的推送:

git push -f origin HEAD^:master

此命令将在一次提交时回退远程存储库。

要撤消拉动,您可以执行以下操作:

git reset --hard {hash of the last commit before pull}

拥有一个中央裸存储库会很有帮助,但是......它只是另一个git存储库,你可以在其中推送和拉出;

答案 1 :(得分:1)

  • 执行git reset --merge

  • 并不危险
  • 通过对git pull执行git reset --hard可以“撤消”git push 拉完之前提交。

  • git reset可以通过git push -f向您提交来“撤消” 实际上想要在你的本地仓库中,然后通过git config receive.denyCurrentBranch warn

  • 强行推动它
  • 中央存储库将是更标准的设置。

为什么无法推送到已签出的遥控器上的分支?

因为通过某些外部仓库将更改推送到您的存储库中,通常会让您感到困惑。

我可以用一些非危险的方式强制执行此操作吗?

您可以通过在该repo中发出此命令来配置git以允许它(我理解您的pc repo):

git reset --hard

然后您可以将更改推送到已签出的分支。但是,当您切换到pc repo时,您将处于混乱状态,因为这些更改不会反映在工作树中。实际上看起来你已经撤消了这些更改(因为它们在repo中但不在工作树中)。

您可以按git reset HEAD <file>获取推送的更改,但这会丢弃您拥有的任何本地更改。如果您有本地更改,则必须使用git checkout -- <file>C:\git\pc_repo [master]> git config receive.denyCurrentBranch warn C:\git\pc_repo [master]> cd .. C:\git> cd .\laptop_repo C:\git\laptop_repo [master]> echo hello >> text.txt C:\git\laptop_repo [master]> git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: text.txt # no changes added to commit (use "git add" and/or "git commit -a") C:\git\laptop_repo [master +0 ~1 -0]> git commit -am "modified text" [master 4925c26] modified text 1 file changed, 2 insertions(+), 1 deletion(-) C:\git\laptop_repo [master]> git push Counting objects: 5, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 303 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: warning: updating the current branch To C:/git/.\pc_repo\.git eb4f07f..4925c26 master -> master C:\git\laptop_repo [master]> cd .. C:\git> cd .\pc_repo C:\git\pc_repo [master +0 ~1 -0]> git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: text.txt # C:\git\pc_repo [master +0 ~1 -0]> git reset --hard HEAD is now at 4925c26 modified text C:\git\pc_repo [master]> git status # On branch master nothing to commit, working directory clean C:\git\pc_repo [master]>

手动还原已推送的每个文件

这是一个示例,我设置配置,切换到笔记本电脑,进行更改,推送更改,切换到PC,并重置该repo以获取工作树中的更改:

{{1}}