刚刚面临一个问题,有人覆盖了我的整个提交,并且还有很多其他提交,现在我必须重新提交该特定提交.任何帮助,将不胜感激.
有人合并冲突,而合并时他失去了我所有的变化.我不知道他做了什么,但我的改变不在那里.在历史上,我的提交就在那里,但如果我看到他的合并,我的更改将被还原.
现在我无法恢复他的合并提交,因为它包含大量文件与我比较我也不想手动逐个更改每个文件.有没有办法在不影响其他人的情况下取回我的更改.
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的书有其他建议,包括先进合并的一章.
您可以从旧提交中创建一个分支,然后按照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)