Bir yorumda yazdıklarımı genişletme
Genel kural, yayınladığınız tarihi yeniden yazmamanız (değiştirmemeniz) çünkü birileri çalışmalarını buna dayandırmış olabilir. Geçmişi yeniden yazarsanız (değiştirirseniz), değişikliklerinin birleştirilmesi ve güncellenmesi ile ilgili sorunlar yaşarsınız.
Solüsyon yaratmaktır Yani bir yeni taahhüt hangi geri döner değişiklikler sen kurtulmak istiyorum. Bunu git revert komutunu kullanarak yapabilirsiniz .
Aşağıdaki durumunuz var:
A <- B <- C <- D <- master <- KAFA
(buradaki oklar işaretçinin yönünü belirtir: taahhütlerde "üst" referansı, şube başı durumunda üst taahhüt (şube ref) ve HEAD referansı durumunda dalın adı).
Oluşturmanız gereken şey şudur:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- KAFA
burada "[(BCD) ^ - 1]" B, C, D komisyonlarındaki değişiklikleri geri alan taahhüt anlamına gelir. Matematik bize (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, aşağıdaki komutları kullanarak gerekli durumu alabilirsiniz:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Alternatif çözüm, A taahhüdünün içeriğini kontrol etmek ve bu durumu taahhüt etmektir :
$ git checkout -f A -- .
$ git commit -a
O zaman aşağıdaki duruma sahip olursunuz:
A <- B <- C <- D <- A '<- master <- KAFA
A 'komutu, A komutu ile aynı içeriğe sahiptir, ancak farklı bir taahhüttür (taahhüt mesajı, ebeveynler, taahhüt tarihi).
Charles Bailey tarafından modifiye Jeff Ferland tarafından çözüm, aynı fikri üzerine inşa fakat kullanır git reset :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(uzak dalın usta olduğu varsayılarak). Evet, böyle bir taahhütte bulunabilirsiniz.