次のような状況の場合、
$ git log --oneline
* abcdef commit #b
* 123456 commit #a
いつでも走れることを知っている
$ git reset HEAD~
$ git commit --amend
しかし、走ってみました
$ git rebase -i HEAD~2
しかし私は得た
fatal: Needed a single revision
invalid upstream HEAD~2
したがって、私の質問:git rebase
を使用してこれら2つのコミットを押しつぶす方法はありますか?
master
ブランチのルートコミットにリベースしたい。より具体的には、2つのコミットを押しつぶすには、次を実行する必要があります。
git rebase -i --root
次に、ポップアップするエディターのバッファーの2行目のsquash
をpick
に置き換えます。
pick 123456 a
squash abcdef b
このフラグの詳細については、 git-rebase
のマニュアルページ を参照してください。
--root
<branch>
でコミットするのではなく、<upstream>
から到達可能なすべてのコミットをリベースします。これにより、ブランチのルートコミットをリベースできます。 [...]
# Set things up
$ mkdir testgit
$ cd testgit
$ git init
# Make two commits
$ touch README
$ git add README
$ git commit -m "add README"
$ printf "foo\n" > README
$ git commit -am "write 'foo' in README"
# Inspect the log
$ git log --oneline --decorate --graph
* 815b6ca (HEAD -> master) write 'foo' in README
* 630ede6 add README
# Rebase (interactively) the root of the current branch:
# - Substitute 'squash' for 'pick' on the second line; save and quit the editor.
# - Then write the commit message of the resulting commit; save and quit the editor.
$ git rebase -i --root
[detached HEAD c9003cd] add README; write 'foo' in README
Date: Sat May 16 17:38:43 2015 +0100
1 file changed, 1 insertion(+)
create mode 100644 README
Successfully rebased and updated refs/heads/master.
# Inspect the log again
$ git log --oneline --decorate --graph
* c9003cd (HEAD -> master) add README; write 'foo' in README
このパラメータが役立つ可能性があります:
--root
<upstream>で制限するのではなく、<branch>から到達可能なすべてのコミットをリベースします。これにより、ブランチのルートコミットをリベースできます。
これにより、2番目のコミットを最初のコミットにつぶすことができます(実際に修正したいと思います)。
git rebase --root -i
--rootオプションが何をするか理解するように注意してください。あなたのケースではあなたのニーズに応えますが、例えばブランチで使用される場合、それは到達可能な歴史の中で最も遠い先祖(つまり、ツリーのルート);そのため、rebase --root
は、z
に基づいてa
をA-B-D-E-X-Y-Z
を介してリベースします:
master A-B-C
\
upstream D-E
\
current branch X-Y-Z
タイトルへの答えを探してこの質問に行きました。非常に大きなリポジトリで受け入れられた回答は、与えられたjustではなく、メインブランチ(別名:マスター)でのコミットごとにインタラクティブなリベースを生成しますブランチ。ここに来る他の人にとって、代わりの方法は親ブランチ名を使う(またはコミットする)ことです:
git rebase -i <base_branch_name>
Git docsを調べてこれを見つけた後、これに気付きました( https://git-scm.com/docs/git-rebase#_interactive_mode ):
そのまま保持する最後のコミットから開始します。
git rebase -i <after-this-commit>
エディターは、現在のブランチのすべてのコミット(マージコミットは無視)で起動されます。これらのコミットは、指定されたコミットの後に来ます。
あなたがbranch_aがマスターから分岐していて、インタラクティブにbranch_a
ですべてのコミットをリベースしたいとします。それを行うには、次のようにします。
git rebase -i master
または、途中で(またはコミット時に)開始する場合は、次のようにします。
git rebase -i <some-commit-hash-in-the-middle>
他の一般的な形式は、「現在の場所から5つのコミットをリベースしたい」ということを知っている場合です。
git rebase -i HEAD~5
これにより、git rebaseが数千行のコミットでエディターを開いたときに、誰かが心臓発作を回避するのに役立つことを願っています。 ─=≡Σ(((つ> <)つ