Dosya ekleme son taahhüdünü nasıl değiştirebilirim?


108

Ben iki dosya değiştirdiniz a, bson olarak kullanırlar. Ancak dosya btaahhüt edilmemelidir, bunu düzeltmek için iş akışı nedir?

Yanıtlar:


109

Güncelleme (birkaç yıl sonra)

Jan Hudec

Yalnızca dizinden kaldırmak çok önemlidir.

Doğru: En yakın yanıtın ( Matt Connolly tarafından yazılmıştır ) önerdiği gibi, bir dosyayı dizin içeriğine kolayca kolayca sıfırlayabilirsiniz :

git reset HEAD^ path/to/file/to/revert

HEAD^önceki tamamlama, içeriğini erişmek için dosyayı verir önce sonuncusu.

O zaman, git commit --amendaslen aşağıda yazdığım gibi yapabilirsin.


Git 2.23 ile (Ağustos 2019), yeni komutu kullanabilirsiniz.git restore

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

daha kısa:

 git restore -s@^ -S -- path/to/file/to/revert

Yine, daha sonra, git commit --amendaslen aşağıda yazdığım gibi yapabilirsin.


Orijinal cevap (Ocak 2011)

Eğer bu senin son işin buysa (ve hiçbir yere itmediysen), düzeltebilirsin :
(ilk önce sakla ya da sakla b)

 git commit --amend

Sonra b'yi silin, tekrar onaylayın. B'yi geri yükle ve bittin.

--amend

Mevcut dalın ucunu değiştirmek için kullanılır.
En son işlemeyi her zamanki gibi değiştirmek istediğiniz ağaç nesnesini hazırlayın (bu, normal -i / -o ve açık yolları içerir) ve işlem günlüğü düzenleyicisi, geçerli dalın ipucundan gelen işlem mesajı ile birlikte ekilir.
Yarattığınız taahhüt geçerli ipucunun yerine geçiyor - eğer bir birleşme olsaydı, mevcut ipucunun ebeveynlerini ebeveyn olarak alacak - bu yüzden mevcut üst taahhüdü atılır.


... Then stash/delete b, re-commit.., işte kelime Thenolmamalı aftermı? - --amendstach / b sildikten sonra, ...
Xiè Jìléi

@ 谢 继 雷: Başka bir deyişle, önce b'yi kaydedin, sonra taahhüt verin - sonra, sonra geri yükleme? Doğru. Cevabı güncelledim.
VonC

Git indeksinin gücüyle, kimsenin dosyayı saklamasını / kaydetmesini söylemek aptalca (-1). Yalnızca dizinden kaldırmak çok önemlidir.
Jan Hudec,

1
@JanHudec Doğru, cevabı buna göre düzenledim. Stack Overflow'ta yaptığım kadar eski cevapları takip etmedim. SU hakkındaki git sorularının% 99'u yine de SO'da geçirilmelidir.
VonC,

66
  1. git diff --name-only HEAD^ - (isteğe bağlı) son işlemde değişen dosyaları listelemek için kullanın.
  2. git reset HEAD^ path/to/file/to/revert- dizini bu son sürüme sıfırlamak ve çalışma kopyasını el değmeden bırakmak için.
  3. git commit --amend- endeks değişikliklerini içerecek son taahhüdün değiştirilmesi

9
Bu, kabul edilen cevaptan daha iyi bir cevap.
mik01aj,

1
git commit -a --amend3. adım için kullanmamanız gerektiğini (yani dosya eklemeyin) veya kaldırmaya çalıştığınız düzenlemeler olan çalışma kopyası değişikliklerinizi yapmayı unutmayın. İsteğe bağlı bir adım 2.5 git checkout path/to/file/to/revert, çalışan kopyanızı da temizlemek olabilir .
dmnd

1
Alternatif git rm --cached path/to/file/to/revertolarak dosyayı ağaçtan silmeden eklentiyi kaldırmak için.
Jan Hudec

13

Alternatif olarak kullanıyorsanız git gui, sadece "Son taahhüdü değiştir" seçeneğini seçersiniz, eklenen dosya "Aşamalı" listesinde görünür, "İstenmeyen" listesine taşımak ve onaylamak için bu simgeye tıklayın.


1
@VonC: Yamaların düzenlenmesi ve bölünmesi, ağır git kullanıcıları için oldukça yaygın bir işlemdir, bu nedenle gui kolaylaştırmak için tasarlanmıştır ve IMO bunun için en iyi araçtır.
Jan Hudec

Bu işe yarıyor! Belirli bir görev için diğer seçeneklerde başarılı olamadım. Bahşiş için teşekkürler!
Serguzest

10

B'yi son işlemden silmek istiyorsan

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

B'deki tüm değişiklikleri son işleminizde kaldırmak istiyorsanız

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cachedve yedekleme / geri yükleme dansıyla (-1) uzaklaşın.
Jan Hudec

Bunu gösterdiğin için teşekkürler. Bunu nasıl yaptığımı paylaşmak istedim çünkü bu, tüm konuyu okuduktan sonra bile en rahat ettiğim yaklaşımdı.
pingo

4

Dizin hackery gerektirmeyen, ancak yine de eski taahhüt mesajını koruyan bir alternatif:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

Bunu seviyorum çünkü (a) düzenli olarak kullandığım komutları kullanıyor ve (b) git add -ptam olarak ne yapmak istediğimi bulmak için yapabilirim.

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.