git pull --rebase
如果我直接在 master 上工作(我尽量不这样做),我通常会使用。如果我忘记做 rebase 而只是做了git pull
,有没有办法撤消它并使其成为线性,而不是合并?在这一点上做一个变基是一个坏主意(如果这甚至可以完成任何事情)?
我知道我可以在默认情况下启用 rebase,所以我不会忘记,但这更多的是理解在这种情况下要做什么的问题。
简短回答(@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
并且它抱怨合并失败该怎么办。:-)
我想git reset --hard
回到拉动之前并重做拉动是方法
我想给你一些有助于保持历史线性的建议。设置以下 git 配置,以便在您拉取时自动重新设置分支。
$ git config branch.autosetuprebase always
应用此设置后,您无需键入带--rebase
参数的完整拉取命令,只需git pull
.
您可以在本文中获得更多信息 http://stevenharman.net/git-pull-with-automatic-rebase