我通常使用git pull --rebase
如果我直接在master上工作(我尽量不去做)。如果我忘记进行重新署名并且只是做了git pull
,是否有办法撤消这个并使之成为线性的,而不是合并?在这一点上做一个rebase是一个坏主意(如果这甚至可以完成任何事情)?git rebase after pull
我知道我可以把默认启用重新绑定拉,所以我不会忘记,但这是更多的理解在这种情况下做什么的问题。
我通常使用git pull --rebase
如果我直接在master上工作(我尽量不去做)。如果我忘记进行重新署名并且只是做了git pull
,是否有办法撤消这个并使之成为线性的,而不是合并?在这一点上做一个rebase是一个坏主意(如果这甚至可以完成任何事情)?git rebase after pull
我知道我可以把默认启用重新绑定拉,所以我不会忘记,但这是更多的理解在这种情况下做什么的问题。
我猜git reset --hard
回拉前和重做拉的方式是
简短回答(@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
在这种情况下,没有合并提交,只是一个快进,所以,没有问题,有没有改变衍合!如果你做了一个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
现在图-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配置,以便在进行pull操作时自动重新绑定分支。
$ git config branch.autosetuprebase always
应用此设置,不需要输入与--rebase
参数,只是git pull
完全拉出指令后。
更多信息,您可以在这篇文章中得到 http://stevenharman.net/git-pull-with-automatic-rebase
正如我的问题所述,我知道我可以做到这一点。我只是想学习在这种情况下做什么。 –
我想'git的前拉回到复位--hard'到重做拉就是这样。 – Alex
谢谢。你能否将其作为回答而不是评论发布? –