拉后git rebase

时间:2013-05-31 22:46:26

标签: git rebase pull

如果我直接在master上工作,我通常会使用git pull --rebase(我不会这样做)。如果我忘了做一个rebase而只是git pull,有没有办法撤消它并使其成为线性,而不是合并?在这一点上做一个不好的想法(如果那甚至可以完成任何事情)?

我知道默认情况下我可以在启用时设置启用,因此我不会忘记,但这更像是一个理解在这种情况下应该做什么的问题。

3 个答案:

答案 0 :(得分:14)

简短回答(已在评论中由@Alex提供):git reset --hard HEAD^,但仅在有合并提交时(否则您只是从快进中备份一个提交) )。

长版本说明:

git pull实际上只是git fetch后跟git merge(除非您覆盖--rebase,正如您所注意到的那样)。所以你只需要看看你是否有实际的合并提交:

$ git pull
Updating 171ce6f..523bacb
Fast-forward
 mp.py |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
 create mode 100644 mp.py

在这种情况下,没有合并提交,只是一个快进,所以,没问题 - rebase没有变化!如果您执行git log,您将看到缺少合并提交,特别是如果您执行下面的图形y。

让我们强制合并。

$ git reset --hard HEAD^
HEAD is now at 171ce6f ignore *.log files

[现在我落后于remotes/origin/master]

$ echo '# pointless comment' >> selfref.py
$ git add selfref.py 
$ git commit -m 'added to force merge'
[master 260e129] added to force merge
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git pull
Merge made by recursive.
 mp.py |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
 create mode 100644 mp.py

我们可以看到,即使上面的文字丢失,也会发生这种情况:

$ git log --graph --decorate --abbrev-commit --pretty=oneline
*   c261bad (HEAD, master) Merge branch 'master' of [ssh url]
|\  
| * 523bacb (origin/master, origin/HEAD) add multiprocessing example
* | 260e129 added to force merge
|/  
* 171ce6f ignore *.log files

我们想让本地分支名称master再次指向(在本例中)260e129。幸运的是,这很容易命名:

$ git rev-parse HEAD^
260e1297900b903404c32f3706b0e3139c043ce0

(当前双亲合并提交的另一个父级是HEAD^2。)所以:

$ git reset --hard HEAD^
HEAD is now at 260e129 added to force merge

现在我们可以重新登录remotes/origin/master(我将使用真正的简短名称origin来命名):

$ git rebase origin
First, rewinding head to replay your work on top of it...
Applying: added to force merge

现在,graph-y单行日志显示:

$ git log --graph --decorate --abbrev-commit --pretty=oneline
* 4a0b2e2 (HEAD, master) added to force merge
* 523bacb (origin/master, origin/HEAD) add multiprocessing example
* 171ce6f ignore *.log files

从这一切开始,如果你运行git pull并且它抱怨合并失败,你应该能够弄清楚要做什么。 : - )

答案 1 :(得分:3)

我猜git reset --hard回到拉动之前,重做拉动是

答案 2 :(得分:1)

我想给你一些有助于保持历史线性的建议。设置以下git配置,以便在进行拉动时自动重新定义分支。

$ git config branch.autosetuprebase always

应用此设置后,您无需使用--rebase参数键入完整拉取命令,只需git pull

您可以在本文中获得更多信息 http://stevenharman.net/git-pull-with-automatic-rebase