Git'te kök taahhüdü düzenlensin mi?


328

Mesajı daha sonraki işlemlerden değiştirmenin yolları vardır:

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*

İlk taahhüdünün (üst öğesi olmayan) taahhüt mesajını nasıl değiştirebilirsiniz?



Özellikle: senaryosunda olduğu GIT_COMMIT ortam değişkeni kullanımıgit filter-branch --msg-filter
fork0

Yanıtlar:


284

Temiz bir çalışma ağacınız olduğunu varsayarsak, aşağıdakileri yapabilirsiniz.

# checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master

23
Bunun olması gerektiğine inanıyorum git rebase --onto HEAD <sha1-of-root> master.
Andrew

5
Doğru, ama orijinal kökünün <upstream> için işlemesini istiyorsunuz git rebase. <yukarı akışta> olmayan git rebase<branch> ( master) ' daki taahhütleri uygular ; HEADiçeri girmediği masteriçin sürümünüzün tümünü uygulamaya çalışır master.
Andrew

7
Evet, git rebase --onto HEAD <sha1-of-root>master'ın <sha1-of-root>aynı yerde kullanıldığından emin olun git checkout <sha1-of-root>. Aksi takdirde, 2 olacak first commit.
Andy

2
@Cupcake: Komutun eski sürümünü test ettiniz mi? İyi çalışmalı. Değişiklik, yalnızca eski ve yeni kök taahhütleri tam olarak aynı değişiklikleri sunacak ve böylece eski kök taahhüdü otomatik olarak atlanacaktır. İkincisi HEADtüm taahhütlerin dikkate alınmasını ve master'a geri dönmek için rebase'nin iki parametre versiyonunu kullanabilmemizi sağlar. Lütfen bu cevabın yeniden reddetme --rootseçeneğinin varlığından önce geldiğini unutmayın .
CB Bailey

9
ecdpalma'nın cevabı aşağıda çok daha kolay ve basittir ve daha fazla oyu vardır, insanları aşağı kaydırın!
Flimm

567

Git 1.7.12 sürümünden itibaren , artık

git rebase -i --root

belgeleme


2
bu komutu kullanarak tüm dalların kökünü yeniden oluşturmak mümkün mü? Bu, mevcut dalı yeni kök üzerine
ayıracak

@ woojoo666 o zaman dalları yeni kök üzerine yeniden oluşturmak zorunda kalacaksınız. her zaman oldugu gibi.
berkus

@Atcold, yukarı akış kökü yoksa işe yaramaz
Kai

Uyarı: Yanlışlıkla bunun kullanıma alınmış şubemin kökünü yapacağını varsaydım, ancak tüm taahhütleri yüklemek, sonra hepsini yeniden oluşturmak biraz zaman alıyor.
Aslan

2
@Leo Yorumunuz ne anlama geliyor? Birinci kısım ile ikinci kısım arasındaki bağlantıyı göremiyorum - biraz zaman ayırmanın bununla ne ilgisi var?
boycy

66

Ecdpalma'nın cevabını genişletmek için , artık kök / ilk taahhüdü yeniden yazmak istediğinizi --rootsöylemek için seçeneği kullanabilirsiniz rebase:

git rebase --interactive --root

Ardından kök taahhüt rebase TODO listesinde görünecek ve onu düzenlemeyi veya yeniden yazmayı seçebilirsiniz:

reword <root commit sha> <original message>
pick <other commit sha> <message>
...

Bu açıklama ise --rootgelen Git Rebase docs (vurgu benim):

Tüm taahhütleri <branch>bir ile sınırlamak yerine erişilebilir <upstream>. Bu, bir daldaki kök taahhütleri yeniden oluşturmanıza olanak tanır .


12

Sadece daha yüksek puanlı cevaplara bir alternatif sunmak için:

Bir repo oluşturuyorsanız ve gelecekte "ilk" gerçek taahhüdüne dayanacağınızı önceden biliyorsanız, başlangıçta açık bir boş taahhüt yaparak bu sorunu tamamen önleyebilirsiniz:

git commit --allow-empty -m "Initial commit"

ve ancak o zaman "gerçek" taahhütler yapmaya başlayın. Daha sonra standart yolun üstesinden kolayca geri dönebilirsiniz, örneğingit rebase -i HEAD^


4
Bu, bunun işe yaraması için, projenizin en başında boş bir taahhütte bulunmanız için öngörüye sahip olmanız (veya psişik olmanız) anlamına gelmiyor mu? Bu benim için son derece durumsal ve genel olarak pratik değil . Ne düşünüyorsun? Zaten 100 taahhütte bulunduysam ve aniden kök taahhüdünü düzenlemem gerekirse ne olur? Başlangıçta bu boş taahhütte bulunmazsam, bu hala işe yarayacak mı?

2
Kök taahhüdünün mesajını düzenlemek, muhtemelen 100'lerine sahip olduktan sonra yapacağınız bir şey değildir. Bazen sadece bir git repo'ya sahip olmak, bazı işe yaramaz taahhütler yapmak, bazı kullanılabilir durumlara ulaştığımda, onları örneğin bir tane haline getireceğimi ve mesajı yeniden gözden geçireceğimi bilmek istiyorum. Her neyse, şimdi fikrimi değiştirdim ve bence ilk taahhüt için kesinlikle en faydalı şey .gitattributesboş bir taahhüt yerine dosya koymak olacaktır .
jakub.g

4

Şunları kullanabilirsiniz git filter-branch:

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit

Ben filtre-şube değiştirmek yazar / committer kullanıyorum ve -- --allseçenek gerçekten de bu durumda kök taahhüt işlemek için anahtardır.
sschuberth
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.