web-gelistirme-sc.com

git stash -> mevcut değişikliklerle stashed değişikliği birleştir

Şubemde bazı değişiklikler yaptım ve unuttum fark ettim ki, şubede gerekli bazı değişiklikleri sakladım. İstediğim şey, saklı değişikliklerimi geçerli değişikliklerle birleştirmenin bir yoludur.

Bunu yapmanın bir yolu var mı?

Kolaylık sağlamak için daha fazlası, sonunda vazgeçtim ve önce mevcut değişikliklerimi, sonra da saklanmış değişikliklerimi yerine getirdim, ancak onları bir kez basmayla almayı tercih ederdim.

155
Bemis

Az önce yapılan değişiklikleriniz dizine eklenirse (yani "evreleme", git add ...) kullanarak, o zaman git stash apply (ve, muhtemelen, git stash pop) gerçekten uygun bir birleştirme yapabileceğini öğrendim. . Çatışma yoksa, sen altınsın. Değilse, git mergetool ile veya normal olarak bir editör ile manuel olarak çözün.

Açık olmak gerekirse, bahsettiğim süreç bu:

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

... ki muhtemelen aradığın şey budur.


tl; Dr.

Önce git add komutunu çalıştırın.

225
Joshua Warner

git stash pop veya git stash apply komutunu çalıştırmak aslında bir birleşmedir. Stash'da değiştirilen dosyalar çalışma kopyasında da değişmediği sürece mevcut değişikliklerinizi yapmanız gerekmemeniz gerekir, bu durumda bu hata iletisini görürdünüz:

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

Bu durumda, mevcut değişikliklerinizi tek adımda stash'a uygulayamazsınız. Değişiklikleri kabul edebilir, boşluğu uygulayabilir, tekrar işleyebilir ve bu iki komisyonu git rebase kullanarak ezebilirsiniz, ancak gerçekten iki işlem yapmak istemezseniz, bu değer daha fazla sorun olabilir.

69
Brandan

İstediğim şey, saklı değişikliklerimi geçerli değişikliklerle birleştirmenin bir yolu

İşte bunu yapmak için başka bir seçenek:

git stash show -p|git apply
git stash drop

git stash show -p, kaydedilen son saklamanın yamasını gösterir. git apply uygulayacaktır. Birleştirme yapıldıktan sonra, birleştirilmiş stash git stash drop ile düşürülebilir.

21
ks1322

Olabilir, (difftool ile) birleştirme en kötü fikir değil ... evet ... bir dal!

> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch
0

Bunu yapma yolum ilk önce git add _ ardından git stash apply <stash code>. En basit yol bu.

0
user3856437

@Brandan tarafından önerildiği gibi, dolaşmak için yapmam gerekenler burada.

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

Bu işlemi takip edin:

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

Ve tamamen birleştirilmiş olarak bırakılacaksınız yerelfile olarak değiştirilecek, daha fazla çalışmaya/temizlemeye ya da tek bir iyi taahhütte bulunmaya hazır olacaksınız. Veya, file öğesinin birleştirilmiş içeriğinin doğru olacağını biliyorsanız, uygun bir mesaj yazabilir ve git reset HEAD^ atlayabilirsiniz.

0
knickum