Yalnızca bazı dosyaları nasıl taahhüt ederim?


261

İki projem var. Birincisi "resmi" proje ve ikincisi hafif bir modifikasyon (bazı dosyalar eklendi). Yeni bir şube oluşturdum ve onlara yeni dosyalar koydum. Ancak geliştirme sırasında her iki dal için ortak olan bazı dosyalar değiştirilir.

Yalnızca bu dosyaları nasıl taahhüt ederim?


Bu iki proje aynı git deposuna mı bağlanıyor?
Oleksandr

Evet, aynı depo, ama
şubemi

Öyleyse neden yeni dalınızı usta (veya başka bir resmi dal) ile birleştirmiyorsunuz
Oleksandr

1
Bu soruların cevapları size yardımcı olacaktır: stackoverflow.com/questions/7161860/… stackoverflow.com/questions/7175869/…
eckes

Yanıtlar:


263

Sanırım bir dalda değişiklik yapmak ve daha sonra bu değişiklikleri diğer dalda görünür kılmak istiyorsunuz. Git'te şubeleri değiştirirken HEAD üzerinde herhangi bir değişiklik olmamalıdır.

Yalnızca değiştirilen dosyaları şu şekilde taahhüt edersiniz:

git commit [some files]

Veya temiz bir hazırlama alanınız olduğundan eminseniz,

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

Eğer bu taahhüdü her iki dalda da kullanılabilir kılmak istiyorsanız

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again

23
Kelimenin tam anlamıyla yalnızca bu dosyaları işlemek için , diğer değişiklikler hazırlanmış olsa bile, ikinci örnek ( anahtarı git commit [some files]ima eden --only) kullanılmalıdır. İlk örnek ( git add [some files]ardından gelen git commit), hazırlanmış olan diğer değişiklikleri de uygulayacaktır.
Lexikos

4
Git komut [bazı dosyalar] için örnekler sunmak yararlı olacaktır. nasıl [bazı dosyalar], virgül, boşluk nasıl değiştirilmeli?
Claudiu Creanga

2
@claudiu genellikle kabuk şeyler boşluk sınırlıdır. Ve eğer yeterince derine
Alex

Bazı örnekler ekleyebiliyorsanız, bu cevap harika olacaktır.
Yamur

155

Taahhüt etmek istediğiniz dosyaların bir listesini alın

$ git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   file1
modified:   file2
modified:   file3
modified:   file4

Dosyaları sahnelemeye ekle

$ git add file1 file2

Ne yaptığınızı görmek için kontrol edin

$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    modified:   file2

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file3
    modified:   file4

Dosyaları bir taahhüt mesajı ile teslim et

$ git commit -m "Fixed files 1 and 2"

Yanlışlıkla yanlış dosyaları taahhüt ederseniz

$ git reset --soft HEAD~1

Dosyaları açmak ve baştan başlamak istiyorsanız

$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4

93

Güncellenmiş bazı dosyaları şu şekilde işleyebilirsiniz:

git commit file1 file2 file5 -m "commit message"

30

Bunlardan bazıları "eksik" gibi görünüyor

İnsan grupları tırnak işareti kullanmaları gerekip gerekmediğini bilmeyeceklerdir.

Konum yollarını da gösteren 1 belirli dosya ekleyin

git add JobManager/Controllers/APIs/ProfileApiController.cs

Taahhüt (unutmayın, taahhüt yalnızca yereldir, başka bir sistemi etkilemez)

git commit -m "your message"  

Uzak repoya aktar

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

Diğer cevap (lar) bazen yapmak isteyeceğiniz zulayı vb . Gösterir .


11

Zaten hazırlanmış dosyalarınız varsa, bunları etkisiz hale getirin:

git reset HEAD [file-name-A.ext] [file-name-B.ext]

Sonra onları yavaş yavaş ekleyin.


11

Diyelim ki birden fazla dosyada değişiklik yaptınız, örneğin:

  • file1
  • file2
  • dosya3
  • File4
  • File5

Ancak yalnızca Dosya1 ve Dosya3'te değişiklik yapmak istiyorsunuz.

Bunu yapmanın iki yolu vardır:

1. kullanarak sadece bu iki dosyayı sahne:

git add file1 file2

sonra, taahhüt

git commit -m "your message"

sonra it,

git push

2. doğrudan taahhüt

git commit file1 file3 -m "my message"

sonra it,

git push

Aslında ilk yöntem, dosyaları düzenli olarak değiştiriyor ve hazırlıyor olmamız durumunda faydalıdır -> Büyük Projeler, genellikle Canlı projeler.
Ancak dosyaları değiştiriyor ve sahnelemiyorsak, doğrudan taahhütte bulunabiliriz -> Küçük projeler


İkinci örnekte belirtildiği gibi dosya adını belirtmediğinizde git, bu bağımsız değişkenlerin komut bayrağının olduğunu varsayar --only. Sonra, aynı komutla git commit --only file1 --only file3 -m "my message"veyagit commit -o file1 -o file3 -m "my message" Referans ile : git-scm.com/docs/git-commit
user

0

Çok fazla kod değişikliğiniz yoksa bu basit bir yaklaşımdır:

1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

Ardından, ayrı bir taahhütte veya başka bir dalda kaldırdığınız kodu (taahhüt etmediğiniz bitler) istiyorsanız, yine de bu daldayken yapın:

5. git stash apply
6. git stash

Zaten stash uyguladığınız ve 4. adımda istediğiniz kodu uyguladığınız 5. adımda, yeni uygulanan stash'daki diff ve uncked, 4. adımda taahhüt etmeden önce 3. adımda kaldırdığınız koddur.

Böyle bir adım 6, muhtemelen bu değişiklikleri kaybetmek istemediğiniz için [taahhüt etmek istemediğiniz] kodun bir saklamasıdır. Böylece adım 6'daki yeni zulasa, artık doğru zemine git zulası uygulayarak ve taahhüt ederek bu veya başka bir şubeye verilebilir.

Açıkçası bu, bir adımda adımları uyguladığınızı varsayar, eğer bu adımlarda başka bir noktada saklarsanız, yukarıdaki her adım için saklamak ref değerini not etmeniz gerekir (sadece temel saklamak yerine ve en son saklamak yerine).

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.