【问题标题】:git rebase after pull拉后 git rebase
【发布时间】:2013-05-31 22:46:26
【问题描述】:

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

我知道我可以在默认情况下启用 rebasing on pulls,所以我不会忘记,但这更多的是理解在这种情况下该怎么做的问题。

【问题讨论】:

  • 我猜git reset --hard 回到拉动之前并重做拉动就是这样。
  • 谢谢。您能否将其发布为答案而不是评论?

标签: git rebase pull


【解决方案1】:

简答(@Alex 在 cmets 中已经给出):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,您会看到缺少合并提交,特别是如果您执行下面的图形化提交。

让我们强制合并。

$ 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 并且它抱怨合并失败该怎么办。 :-)

【讨论】:

    【解决方案2】:

    我猜git reset --hard 回到拉动之前并重做拉动是方法

    【讨论】:

      【解决方案3】:

      我想给你一些有助于保持历史线性的建议。设置以下 git 配置,以便在您拉取时自动变基分支。

      $ git config branch.autosetuprebase always
      

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

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

      【讨论】:

      • 正如我的问题所述,我知道我可以做到这一点。我只是想了解在这种情况下该怎么做。
      • 在 git 版本 >= 1.7.9 这是git config --global pull.rebase true
      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 2023-03-18
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多