仅遇到一个问题,即有人覆盖了我的整个提交,并且除此之外还有很多其他提交,现在我必须重新提交该特定提交。任何帮助将不胜感激。
有人发生合并冲突,合并时他丢失了我的所有更改。我不知道他做了什么,但是我的改动还不存在。历史上我的提交在那里,但是如果我看到他的合并上方,我的更改将被还原。
现在,我无法还原他的合并提交,因为与我相比,它包含很多文件,而且我也不想手动一个接一个地更改每个文件。有什么办法可以在不影响他人的情况下取回我的更改。
答案 0 :(得分:57)
您可以输入以下命令:
$ git reflog
然后选择要检索的提交的ID。
然后键入以下命令:
$ git cherry-pick <'ID'>
从上面的引用日志中输入ID,而不是<'ID'>
。
然后您将对该提交进行更改。
现在通过以下方法检查是否还有剩余内容:
$ git status
如果未暂存的提交中有任何内容,请通过以下命令将其添加并提交:
$ 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
我希望这个答案是您所期望的。
答案 1 :(得分:34)
最简单的解决方法是,Code_Ninja suggested是使用git cherry-pick
来重新提交您的更改。通常,the method recommended by Venkataraman R不起作用,因为Git会告诉您没有要合并的内容。 (如果可以,也可以。)确切的细节取决于情况。不过,对于后代,让我们看一下发生这种情况的最常见方式。
有人发生合并冲突,合并时他丢失了我的所有更改。
这对于“某人”来说非常容易。让我们给“某人”起个名字;我们称他为粗心的卡尔。卡尔跑步:
git merge carls-feature
或者甚至:
git pull
(尽管我建议像卡尔这样的任何初学者,避免 git pull
-最好直接运行git merge
,这样他才能对他在做)。
无论如何,卡尔现在都会看到:
Auto-merging somefile.ext
CONFLICT (content): Merge conflict in somefile.ext
可怜的卡尔恐慌,在网络上(甚至可能是StackOverflow)搜索建议,而不是看着How to resolve merge conflicts in Git, 1 卡尔只是运行:
git checkout --ours somefile.ext
git add somefile.ext
git commit
卡尔刚刚消灭了你的工作!
请记住,合并的目的是合并。 Git将尝试自行执行此操作,但是有时Git无法独自完成该过程。在这种情况下,Git会停止并从其操作员那里获得帮助。
如果您是发生合并冲突的操作员,那么此人工运算符-您!可以完全,完全,100%地控制合并结果。即使您告诉它正确的结果是完全忽略了另一个人的工作,而只是选择您的版本,Git也会相信您您。
(请注意,即使Git认为它已经正确地合并了两个人的不同更改,Git也不总是正确地完成它。仍然您有责任检查Git是否正确完成了。拥有可以使用的某种全面的测试系统。Git只是遵循简单的文本组合规则,在许多情况下碰巧确实工作得很好。)
1 此处接受的答案建议使用git mergetool
和vimdiff
作为工具。我碰巧不喜欢git mergetool
,建议您也通读其他答案,并尝试找出最适合您的方法。但是,如果git mergetool
对您来说效果很好,那很好。请注意,git mergetool
可以使用vimdiff
以外的其他合并工具;如果您喜欢使用合并工具,则git mergetool
可能能够运行它。 Pro Git book还有其他建议,包括有关高级合并的章节。
答案 2 :(得分:8)
您可以在旧提交的基础上创建分支,然后按照git流程将主节点的更改合并到分支并处理合并冲突。
按照以下步骤从您的旧提交中创建一个分支,并对其进行检出。
git branch branchname <sha1 of your old commit>
git checkout branchname
或
git checkout -b branchname <sha1 of your old commit>
答案 3 :(得分:0)
首先检查您在哪个分支
git log --all
为避免合并冲突,我建议您创建一个分支
git branch <new branch name>
并复制ex的提交ID。
git branch -f <new branch name> <commit ID>
或
git checkout -b <new branchname> <sha1 of your old commit>
然后与master合并,请确保签出到新的分支机构
git merge master
如果push出现问题,并且远程分支是master,则执行以下操作:
git fetch origin
获取最新更改
git rebase origin/master
将您的更改放在首位,最后
git push origin master