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.