2011-12-27 28 views
234

コミットせずに "git merge"を実行することはできますか?git merge without auto commit

「男のgitのマージが」これは言う:

With --no-commit perform the merge but pretend the merge failed and do not autocommit, 
to give the user a chance to inspect and further tweak the merge result before 
committing. 

しかし、私はGitは--no-コミットそれはまだ自動コミットとの合併を使用しようとします。ここに私がやったことだ:

$> ~/git/testrepo$ git checkout master 
Switched to branch 'master' 

$> ~/git/testrepo$ git branch 
* master 
    v1.0 

$> ~/git/testrepo$ git merge --no-commit v1.0 
Updating c0c9fd2..18fa02c 
Fast-forward 
file1 | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

$> ~/git/testrepo$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

、その後の「gitのログは、」v1.0の支店からすべてのコミットはマスターにマージ明らかになりました。

答えて

385

注出力をマージをしながら - それは、このような状況ではFast Forward

を言っている、あなたがしたい:

git merge v1.0 --no-commit --no-ff 
+3

告発があればどうなりますか? – Michelle

+14

@PineappleUndertheSea早送りは競合を起こすことはありません。高速フォワードを伴わない "本当の"マージの場合、 '--no-commit'スイッチは、競合が発生しない場合にのみ有効です。競合が発生した場合、gitは自動的にコミットしません。 – gronostaj

+17

FYI:マージした変更を手作業で入力した場合は、従来のマージではなく、 'rm 'を実行する必要があります。後でgit/MERGE_HEAD'を実行すると、マージが起こったことを忘れてしまいます。 – Jonn

32

ここでは、マージの意味を誤解しています。--no-commitは、MERGE COMMITが発生するのを防ぎます。これは、2つの異なる分岐履歴をマージする場合にのみ発生します。 gitはそれが "早送り"マージであることを示しているので、gitは既にブランチに存在するコミットを順番に適用します。

+10

これは、必ずしも混乱を解消するものではありません。 'git help merge' =>' --no-commit'はマージを実行しますが、マージを失敗したと思わせ、自動コミットしないとユーザにチャンスを確認してさらにマージ結果を微調整してからコミットしてください。もちろん、鍵は '--no-ff'と一緒に使用しています – michael

+3

...多分厳密な用語から逸脱してこのように説明するのはあまり混乱しないでしょう:早送りをしない" git merge "実際にはマージされていないため、マージコミットがありません。これは実際には理想的な状況です。早送りは良いことであり、この余分な「合併コミット」は意味を持ちません。これは適切なデフォルト動作であり、無効にしないでください。 (適切な言い方では、早送りはマージの一種ですが、それは「真のマージ」ではありません)。 – michael

+3

プロジェクトのポリシーに関連しています。場合によっては、これらの余分な "マージメインブランチにフィーチャーを含める必要があるので、ffであってもコミットします。 –

12

だけかのように、1つのすべての変更がコミットコミットしたい場合 - スカッシュもやります。

+0

これは 'git merge v1.0 --no-commit --no-ff'と同じ効果ですか? – jpierson

+0

いいえ、異なる効果です。スカッシュは新しいハッシュで新しいコミットを作成します。これは、ブランチ内のすべてのコミットを、マージのための1つのコミットに結合します。 –

7

珍しいパラメータを覚えておく必要はありません。

git merge branch_name 

それは、あなたのブランチがコミット、あなたは今、これらのコミットをオフにポップし、次での作業の変更にそれらを置くことができる#で進んでいると言うだろう:

git reset @~# 

たとえば、マージ後の場合1分前にコミットしてください:

git reset @~1