Tek bir dosyanın sürümünü bir git dalından diğerine nasıl kopyalarım?


944

Tamamen birleştirilen iki şubem var.

Ancak, birleştirme tamamlandıktan sonra, bir dosyanın birleştirme tarafından dağıtıldığını (başka birinin otomatik biçimlendirme yaptı, gah) ve diğer daldaki yeni sürüme geçmek daha kolay olacağını ve sonra bir satır değişikliğimi şubeme getirdikten sonra yeniden ekleyin.

Peki git'te bunu yapmanın en kolay yolu nedir?


3
Lütfen kabul edilen cevapta ilk çözümün değişiklikleri aşamaladığını ve ikinci çözümün değişmediğini unutmayın. stackoverflow.com/a/56045704/151841
kullanıcı151841

Yanıtlar:


1674

Bunu, dosyanın bitmesini istediğiniz şubeden çalıştırın:

git checkout otherbranch myfile.txt

Genel formüller:

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

Bazı notlar (yorumlardan):

  • İşlem karmasını kullanarak dosyaları herhangi bir işlemden alabilirsiniz
  • Bu dosyalar ve dizinler için geçerlidir
  • dosyanın üzerine yazar myfile.txtvemydir
  • Joker karakterler çalışmıyor, ancak göreli yollar çalışıyor
  • Birden çok yol belirtilebilir

bir alternatif:

git show commit_id:path/to/file > path/to/file

13
Evet, olurdu. Ama sorunun amacı buydu.
Ikke

37
Muhtemelen açık, ama tam dosya adını kullanmanız gerekiyor ... Joker karakterler çalışmıyor!
Chris Hart

6
rağmen .. aynı zamanda güzel bir yol: git show commit_id: yol / dosya / dosya> yol / dosya / dosya
milushov

14
uzaktan: git checkout origin / otherbranch myfile.txt
Roman Rhrn Nesterov

6
Joker karakterler kullanmak işe yarıyor, onları ''kabukla yorumlanmamaları için sarmanız gerekiyor .
Wiktor Czajkowski

82

Bu soruyu benzer bir araştırmada buldum. Benim durumumda başka bir daldan geçerli çalışma dizinine dosyanın özgün konumundan farklı bir dosya ayıklamak istiyordum. Cevap :

git show TREEISH:path/to/file >path/to/local/file

18
'Git show'un amacı, terminale veri içeriğini, dosyanın içeriğiyle tam olarak eşleşmesi garanti edilmeyen okunabilir biçimde vermektir. Bir kelime belgesini bir bütün olarak kopyalamak ve içeriğini kopyalayıp başka bir belgeye yapıştırmaya çalışmak daha iyidir.
Gönen

Ben sadece mevcut şube (bazı kod parçası kontrol) karşı içeriğini karşılaştırmak böylece görüntülemek istedim. Ben vim bu olsa kullanmak istiyorum ... sözdizimi vurgulama, vb için
isaaclw

3
Ödeme yapmadan önce içeriği karşılaştırmak için git diff <other branch> <path to file>iyi çalışır.
Randall

2
@Gonen: git sürüm 2.21.0'dan itibaren, "git show" el kitabı sayfasında "Düz lekeler için, düz içerikleri gösterir." Bunun her zaman iyi olduğumuz anlamına gelip gelmediğinden emin değilim. Bu şekilde bir görüntü almak için biraz ihtiyatlıyım ...
hibbelig

52

Checkout komutunu kullanmaya ne dersiniz?

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

8
note not birleştirme (2. komut), dosya her iki dalda da yoksa çalışmaz
simpleuser

Hm. Farkım yok. Bir fark aracının belirli bir versiyonu mu, çünkü daha önce hiç duymadım (ve ona
geçmeliyim

git diff--stattemelde diffstat ile aynı şeyi yapan bir argümanı destekler .
hlovdal

Ben bu işe almak için her iki şube yerel olarak kontrol olması gerekiyordu.
UnitasBrooks 21:17

18

1) Dosyanın bir kopyasına ihtiyacınız olan şubede olduğunuzdan emin olun. örneğin: Ben ana dalda alt şube dosyası istiyorum bu yüzden ödeme gerekir ya da ana olması gerekirgit checkout master

2) Şimdi sadece alt daldan master'a istediğiniz belirli bir dosyayı kontrol edin,

git checkout sub_branch file_path/my_file.ext

burada sub_branchdosyaya ve ardından kopyalamanız gereken dosya adına sahip olduğunuz anlamına gelir.


Çok kullanışlı ve iyi açıklanmış.
Abk

15

Madlep'in cevabını takiben, bir dizini başka bir daldan dizin blobuyla da kopyalayabilirsiniz.

git checkout other-branch app/**

Op'un sorusuna gelince, orada sadece bir dosya değiştirdiyseniz, bu iyi çalışacaktır ^ _ ^


1
Her iki dalın da ilk önce doğru şekilde çekilmesi gerektiğine veya origin/other-branchrepo dalına başvurmak için kullanıldığına dikkat edin. Temeller, ama beni ısır. (cevap harika - düzenleme gerektirmez)
akauppi

8

Kullanacağım git restore(git 2.23'ten beri mevcut)

git restore --source otherbranch path/to/myfile.txt


Neden diğer seçeneklerden daha iyi?

git checkout otherbranch -- path/to/myfile.txt- Dosyayı çalışma dizinine değil aynı zamanda hazırlama alanına da kopyalar (bu dosyayı elle kopyalayıp yürütür git addgibi). git restoreevreleme alanına dokunmaz ( --stagedseçeneğe göre belirtilmedikçe).

git show otherbranch:path/to/myfile.txt > path/to/myfile.txtstandart kabuk yönlendirmesini kullanır. Powershell'i kullanırsanız, metin geliştirme ile ilgili bir sorun olabilir veya ikili dosya bozuksa alabilirsiniz . git restoreDosyaları değiştirme ile tüm gitçalıştırılabilir tarafından yapılır .

Başka bir avantaj, tüm klasörü şu şekilde geri yükleyebilmenizdir:

git restore --source otherbranch path/to

veya git restore --overlay --source otherbranch path/todosyaları silmekten kaçınmak istiyorsanız ile. Örneğin otherbranch, geçerli çalışma dizinindekinden daha az dosya varsa (ve bu dosyalar izlenirse ) --overlayseçeneği olmadan git restorebunları siler. Ama bu iyi bir varsayılan bahaviour, büyük olasılıkla dizin durumunun otherbranch"aynı değil, mevcut şubemdeki ek dosyalarla" olduğu gibi olmasını istersiniz.


Güzel cevap. git restoreBir dosyayı kaynak daldan hedef daldaki yeni bir dosyaya kopyalamanın bir yolu var mı ? Git show ile bunu shell redirection ( git show otherbranch:path/to/file1.txt > path/to/file2.txt) ile yapabilirim, ancak bahsettiğiniz nedenlerden dolayı shell redirection'dan kaçınmak istiyorum.
AmiralAdama

1
@AdmiralAdama gerçekten değil. Ve bence içeri girmek için büyük bir şans yok git restore(ama kim bilir;)). Bu yeniden yönlendirme sorunları temel olarak Powershell sorunudur, sorun yaşayan başka bir kabuk olup olmadığından emin değildir. Genellikle "git bash" ya da "cmd" ye geri dönüyorum. Burada " git showyeniden yönlendirme" komutlarını kullanmam gerekiyor . Veya GitExtensions gibi GUI'yi kullanın, burada taahhüt dosya ağacına göz atabilir ve herhangi bir dosyada "Farklı kaydet" i tıklayabilirsiniz.
Mariusz Pawelski

Ah, anlıyorum. Powershell kullanmıyorum bu yüzden belki de kabuk yönlendirme benim için np. Bilgi için teşekkürler.
AdmiralAdama

3

Lütfen kabul yanıtında, ilk seçenek olduğunu not aşamalarında (gibi diğer daldan dosyanın tamamını git add ...yapılmıştı) ve varmış gibi dosya kopyalama sadece sonuçları İkinci seçenek, ancak (değişiklikleri sahne etmediğini sadece dosyayı manuel olarak düzenledi ve olağanüstü farklılıklar vardı).

Git kopya dosyasını başka bir şubeden hazırlamadan

Aşamalı değişiklikler (ör git add filename):

$ git checkout directory/somefile.php feature-B

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

Bekleyen değişiklikler (aşamalı veya taahhütlü değil):

$ git show feature-B:directory/somefile.php > directory/somefile.php

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
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:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")

"Feature-B bir dosya değil" alıyorum, şube adı önce gelir, bu konuda -> "> dizin / somefile.php" Bu dosyanın kodlamasını değiştirebilir mi?
Tiago Oliveira de Freitas
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.