如果某人覆盖了我的提交,如何重新提交过去的提交

Cur*_*eek 48 git

刚刚面临一个问题,有人覆盖了我的整个提交,并且还有很多其他提交,现在我必须重新提交该特定提交.任何帮助,将不胜感激.

有人合并冲突,而合并时他失去了我所有的变化.我不知道他做了什么,但我的改变不在那里.在历史上,我的提交就在那里,但如果我看到他的合并,我的更改将被还原.

现在我无法恢复他的合并提交,因为它包含大量文件与我比较我也不想手动逐个更改每个文件.有没有办法在不影响其他人的情况下取回我的更改.

Cod*_*nja 57

您可以键入以下命令:

$ git reflog
Run Code Online (Sandbox Code Playgroud)

然后选择要检索的提交的ID.

然后键入以下命令:

$ git cherry-pick <'ID'>
Run Code Online (Sandbox Code Playgroud)

而不是<'ID'>从上面的reflog 中输入ID.

然后您将获得该提交的更改.

现在检查是否还有剩余的东西:

$ git status
Run Code Online (Sandbox Code Playgroud)

如果有任何内容在非分段提交中,则通过以下命令添加它并提交:

$ git add -A //Any other option or the name of the file with the path that you want to commit
$ git commit -m "Your message here for that commit"
$ git push
Run Code Online (Sandbox Code Playgroud)

我希望这个答案是你所期待的.


tor*_*rek 34

解决此问题的最简单方法通常是,如Code_Ninja建议的那样,git cherry-pick用于重新提交更改.通常,Venkataraman R推荐的方法不起作用,因为Git会告诉你没有任何东西要合并.(如果确实有效,也可以.)具体细节取决于具体情况.但是,对于后人来说,让我们来看看这种情况最常见的方式.

有人合并冲突,而合并时他失去了我所有的变化.

这对于"某人"来说非常容易.让我们给"某人"一个名字; 让我们称他为Carl the Careless.卡尔跑:

git merge carls-feature
Run Code Online (Sandbox Code Playgroud)

或者甚至是:

git pull
Run Code Online (Sandbox Code Playgroud)

(虽然我建议任何初学者,比如卡尔在这里,避免 git pull - 他更好git merge直接跑,这样他就可以了解他在做什么).

无论如何,卡尔现在看到了这个:

Auto-merging somefile.ext
CONFLICT (content): Merge conflict in somefile.ext
Run Code Online (Sandbox Code Playgroud)

可怜的卡尔恐慌,搜索网页(甚至可能是StackOverflow)寻求建议,而不是看,如何解决Git中的合并冲突,1卡尔只运行:

git checkout --ours somefile.ext
git add somefile.ext
git commit
Run Code Online (Sandbox Code Playgroud)

卡尔刚刚把你的工作搞砸了!

请记住,合并的目标是结合工作.Git会尝试单独执行此操作,但有时Git无法自行完成此过程.在这些情况下,Git会停止并从其操作员那里获得帮助.

此人的操作符- ,如果你是一个与合并冲突!-is合并结果的全面,完整的,100%的控制.Git会相信,即使你告诉它,正确的结果是完全忽略了另一个人的工作,只需要你的版本.

(请注意,即使Git认为它已经正确地合并了两个人的不同变化,Git并不总是正确的.但是你仍然有责任检查Git是否正确.最好有一个完整的测试系统你可以使用.Git只是遵循简单的文本组合规则,在许多情况下恰好可以正常工作.)


1此处接受的答案建议使用git mergetoolwith vimdiff作为工具.我碰巧不喜欢git mergetool,我也建议你仔细阅读其他答案,并尝试看看哪种方法最适合你.但是,如果git mergetool适合你,那没关系.注意,git mergetool可以使用其他合并工具vimdiff; 如果你有一个你喜欢的合并工具,git mergetool很可能能够运行它.在临Git的书有其他建议,包括先进合并的一章.


Ven*_*n R 8

您可以从旧提交中创建一个分支,然后按照git进程将更改从master合并到您的分支并处理合并冲突.

下面的步骤用于创建旧提交中的分支并结帐相同.

git branch branchname <sha1 of your old commit>
git checkout branchname  
Run Code Online (Sandbox Code Playgroud)

要么

git checkout -b branchname <sha1 of your old commit>
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,`git branch`(和类似`git checkout -b <new branch name>`)总是*一个本地分支.几乎你在git中所做的每一种改变都是本地的,直到你把它推到一个远程仓库.您始终可以选择仅保留本地内容或仅推送某些分支. (2认同)