Otomatik kaydetme olmadan git birleştirme


402

Yapmak mümkün mü git mergeBir taahhütte ?

"man git merge" diyor:

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.

Ama kullanmaya çalıştığınızda git mergeile --no-commityine otomatik kaydedilmesini. İşte yaptım:

$> ~/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)

Bir sonraki git logbölüm, v1.0 dalından master ile birleştirilen tüm taahhütleri ortaya koyar.

Yanıtlar:


616

Birleştirme yaparken çıktıya dikkat edin - diyor Fast Forward

Bu gibi durumlarda, şunları yapmak istersiniz:

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

7
ya bir çelişki varsa.
Jürgen Paul

20
@PineappleUndertheSea Hızlı ileri sarma asla çatışmalara neden olmaz. Hızlı ileri sarılmadan "gerçek" birleştirme durumunda, --no-commitanahtar yalnızca çakışma olmadığında etkilidir, çakışma durumunda git asla otomatik olarak çalışmayacaktır.
gronostaj

38
Bilginize: Değişiklikleri birleştirmek ve daha sonra birleştirdiğiniz tüm değişiklikleri (geleneksel birleştirmenin aksine) elle yazmış gibi işlemek istiyorsanız,rm .git/MERGE_HEAD daha sonra çalıştırmanız gerekir , bu da git işlemini birleştirmeyi unutmaya zorlar.
Jonn

7
FYI: Başarılı bir birleşme için örnek çıktı:Automatic merge went well; stopped before committing as requested
kevinarpe

6
Görünüşe göre git merge BRANCHENAME --no-commit --no-ffçalışma alanımı git "MERGING" durumunda bıraktı. Bunun tam olarak ne yaptığını tam olarak bilmiyorum, ancak basit git stash saveve git stash popdöngü her şeyi normale döndürüyor gibiydi; hedef daldan yalnızca değiştirildiği gibi, amaçlandığı şekilde yerinde olur ve artık bir BİRLEŞME durumu olmaz.
MoonLite

49

Buradaki birleşmenin anlamını yanlış anlıyorsunuz.

--no-commitEngeller BİRLEŞTİRME oluşmaya COMMIT ve iki farklı şube geçmişlerini birleştirdiğinizde sadece olur; örneğinizde, Git bunun bir "hızlı ileri" birleştirme olduğunu gösterdiğinden ve durum yalnızca dalda zaten var olan taahhütleri sırayla uyguladığı için durum böyle değildir.


12
Bu (imo) karışıklığı mutlaka ortadan kaldırmaz; Ben bu dokümanlar aslında açık bir (nispeten nadir) bir zaman olduğunu düşünüyorum: git help merge=> " --no-commitBirleştirme gerçekleştirmek ama birleştirme başarısız ve otomatik taahhüt yok, kullanıcıya taahhüt önce birleştirme sonucu incelemek ve daha fazla tweak şansı vermek. " Anahtar elbette - ile birlikte kullanmak--no-ff
michael

6
... belki de katı terminolojiden kopmak ve bu şekilde tanımlamak daha az kafa karıştırıcı olurdu: hızlı ileri sarma yapan bir "git merge" birleştirme taahhüdüne sahip değildir, çünkü aslında bir birleştirme yoktur. Aslında bu ideal bir durumdur: hızlı ileri alma iyi bir şeydir ve bu ekstra "birleştirme taahhüdüne" sahip olmamanız mantıklıdır. Bu iyi bir varsayılan davranıştır ve devre dışı bırakılmamalıdır. (Düzgün bir şekilde, bir ileri sarma bir tür birleşmedir, ancak "gerçek bir birleştirme" değildir.)
michael

4
projenin politikalarına görecelidir, bazı durumlarda, ff olsa bile bu ekstra "birleştirme işlemlerini" yaptırmak / zorlamak yararlıdır, çünkü özelliğin ana şubeye dahil edilmesini işaretlemeniz gerekir.
Samus_

7
...ne. Pekala, git neredeyse kurtarılamaz. Özellikle bu cevap beni Mercurial'ı denemeye ikna etti.
Brian Gordon

24

Sadece tek bir işlemdeki tüm değişiklikleri kendiniz yazmışsınız gibi yapmak istiyorsanız, - squash da yapacak

$ git merge --squash v1.0
$ git commit

1
Bu aynı etkiyle migit merge v1.0 --no-commit --no-ff
jpierson

2
Hayır, farklı etki. Squash, yeni bir karma ile yeni bir taahhüt oluşturur. Bir şubedeki tüm taahhütleri birleştirme için tek bir taahhütte birleştirir.
Kavi Siegel

23

Bu şekilde tercih ederim, bu yüzden nadir parametreleri hatırlamak zorunda değilim.

git merge branch_name

Daha sonra şubenizin " #" taahhütleri ile önde olduğunu söyleyecektir , şimdi bu taahhütleri kapatabilir ve aşağıdakilerle çalışma değişikliklerine koyabilirsiniz:

git reset @~#

Örneğin, birleştirme işleminden sonra 1 taahhüt öndeyse, şunu kullanın:

git reset @~1

Not: Windows'ta tırnak işaretleri gereklidir. ( Josh'un yorumlarda belirttiği gibi) eg:

git reset "@~1"

4
Pencerelerde tırnak işaretleri gereklidir:git reset "@~1"
Josh

1

Sadece şubede bir taahhüt varsa, genellikle

git merge branch_name --ff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.