如果有人重写了我的提交,如何重新提交过去的提交

时间:2018-09-05 03:58:10

标签: git

仅遇到一个问题,即有人覆盖了我的整个提交,并且除此之外还有很多其他提交,现在我必须重新提交该特定提交。任何帮助将不胜感激。

有人发生合并冲突,合并时他丢失了我的所有更改。我不知道他做了什么,但是我的改动还不存在。历史上我的提交在那里,但是如果我看到他的合并上方,我的更改将被还原。

现在,我无法还原他的合并提交,因为与我相比,它包含很多文件,而且我也不想手动一个接一个地更改每个文件。有什么办法可以在不影响他人的情况下取回我的更改。

4 个答案:

答案 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 mergetoolvimdiff作为工具。我碰巧不喜欢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