Kullanarak gitk log
ikisi arasında bir fark bulamadım. Farkı nasıl gözlemleyebilirim (git komutu veya bazı araçlarla)?
Kullanarak gitk log
ikisi arasında bir fark bulamadım. Farkı nasıl gözlemleyebilirim (git komutu veya bazı araçlarla)?
Yanıtlar:
--no-ff
Bayrak önler git merge
bunun geçerli olduğunu tespit ederse, bir "hızlı ileri" yürütülmesini HEAD
, birleştirme çalıştığınız taahhüt bir atası. Hızlı ileri sarma, git bir birleştirme taahhüdü oluşturmak yerine, şube işaretçinizi gelen taahhüdü gösterecek şekilde hareket ettirdiğinde ortaya çıkar. Bu genellikle git pull
herhangi bir yerel değişiklik yapılmadan yapılır.
Bununla birlikte, zaman zaman bu davranışın olmasını önlemek istersiniz, tipik olarak belirli bir dal topolojisini korumak istediğinizden (örneğin, bir konu dalında birleşiyorsunuz ve geçmişi okurken bu şekilde göründüğünden emin olmak istiyorsunuz). Bunu yapmak için, geçebilir --no-ff
bayrağı ve git merge
edecektir her zaman hızlı yönlendirme yerine birleştirme inşa.
Benzer şekilde, açıkça ileri sarmak için bir komut yürütmek git pull
veya kullanmak git merge
istiyorsanız ve hızlı ileri saramıyorsa kefaletle kullanmak istiyorsanız, --ff-only
bayrağı kullanabilirsiniz . Bu şekilde düzenli olarak git pull --ff-only
düşünmeden bir şey yapabilirsiniz ve daha sonra hata verirse geri dönüp birleştirmek mi yoksa yeniden birleştirmek mi istediğinize karar verebilirsiniz.
gitk
ya git log --graph
olmayan hızlı ileri bir yaptı ise, birleştirme yaratmadı hızlı ileri birleştirme taahhüt söyledi.
--no-ff
Bir özellikten geliştirmeye veya geliştirmeye hakim olmak, bir çekme talebini birleştirmeye benzer olduğunu söylemek adil olur mu?
--no-ff
.
İşte açık bir açıklaması ve grafik kullanımı ile bir sitegit merge --no-ff
:
Bunu görene kadar git ile tamamen kayboldum. Kullanmak --no-ff
, geçmişi inceleyen birinin üzerinde çalışmak için teslim aldığınız dalı açıkça görmesini sağlar . (bu bağlantı github'ın "ağ" görselleştirme aracını gösterir) Ve işte örneklerle bir başka harika referans . Bu referans birinciyi git ile daha az tanışanlara daha fazla odaklanarak tamamlar.
Benim gibi ve bir Git-guru değilseniz, cevabım , dosyaların iyi belgelenmemiş, ancak çoğu zaman gerçekleşen yerel dosya sisteminden silmeden git'in izlemesinden silinmesini ele almayı açıklar. Başka bir yeni durum hala beni atlatmayı başaran mevcut kodu almaktır.
Web siteme bir paket güncelledim ve iş akışımı görmek için notlarıma geri dönmek zorunda kaldım; Bu cevaba bir örnek eklemenin yararlı olduğunu düşündüm.
Git komutlarımın iş akışı:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
Aşağıda: açıklamalar dahil gerçek kullanım.
Not: aşağıdaki çıktı kesilmiştir; git oldukça ayrıntılı.
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
Uyarı Yukarıdan 3 şey:
1) Çıktıda, yeni dosyaların eklenmesi de dahil olmak üzere ECC paketinin yükseltilmesindeki değişiklikleri görebilirsiniz.
2) Ayrıca /ecc
, bu değişiklikten bağımsız olarak sildiğim iki dosya ( klasörde değil ) olduğuna dikkat edin. Bu dosya silme işlemlerini karıştırmak yerine, daha sonra bu dosyaların silinmesini yansıtacak ecc
farklı bir cleanup
dal oluşturacağım .
3) İş akışımı takip etmedim! Ben ecc tekrar çalışma almaya çalışırken git unuttum.
Aşağıda: git commit -am "updated ecc package"
Normalde yaptığım her şey dahil olmak yerine, dosyaları sadece /ecc
klasöre eklemek istedim . Silinen dosyalar özellikle benim bir parçam değildi git add
, ama zaten git'te izlendikleri için onları bu şubenin taahhüdünden kaldırmam gerekiyor:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
Bu işlemi günde 10+ kez kullandıktan sonra, komutları yürütmek için toplu komut dosyaları yazmaya başladım, bu yüzden git_update.sh <branch> <"commit message">
yukarıdaki adımları yapmak için neredeyse uygun bir komut dosyası hazırladım. İşte bu komut dosyasının Gist kaynağı .
Bunun yerine, git commit -am
üretilen "değiştirilmiş" listeden dosyaları seçip git status
bu komut dosyasındaki dosyaları yapıştırarak kullanıyorum. Bunun nedeni düzinelerce düzenleme yaptığım ancak değişikliklerin gruplanmasına yardımcı olmak için çeşitli şube adları istediğimden kaynaklandı.
--no-ff
Seçeneği birleştirdikten sonra da bir şubeyi güvenli bir şekilde silebilir misiniz ?
Açık Birleştirme : Yeni bir birleştirme taahhüdü oluşturur. (Kullandıysanız alacağınız şey budur --no-ff
.)
Hızlı İleri Birleştirme: Yeni bir taahhüt oluşturmadan hızlı bir şekilde ileri gidin:
Rebase : Yeni bir taban seviyesi oluşturun:
Squash: Düz olması için ezin veya sıkın (bir şey):
Bu --no-ff
seçenek, hızlı ileri bir birleştirme işleminin yapılmamasını ve her zaman yeni bir taahhüt nesnesinin oluşturulmasını sağlar . Git'in özellik dallarının geçmişini tutmasını istiyorsanız bu istenebilir.
Yukarıdaki görüntüde, sol taraf kullanıldıktan sonra git geçmişinin bir örneğidir git merge --no-ff
ve sağ taraf git merge
ff birleşmesinin mümkün olduğu yerlerde kullanımın bir örneğidir .
DÜZENLE : Bu görüntünün önceki bir sürümü, birleştirme taahhüdü için yalnızca tek bir üst öğe belirtiyordu. Birleştirme işlemlerinde, git'in "özellik dalı" ve orijinal dalın geçmişini korumak için kullandığı birden çok üst öğe taahhüdü bulunur. Birden çok üst bağlantı yeşil renkle vurgulanır.
Bu eski bir sorudur ve bu diğer yazılarda biraz zekice belirtilmiştir, ancak bu tıklamayı benim için yapan açıklama, hızlı olmayan ileri birleştirme işlemlerinin ayrı bir taahhüt gerektireceğidir .
git merge --no-ff ecc
sadece git log
şube master için ek birleştirme taahhüdü olacak . Usta, taahhütlü ecc'nin doğrudan bir atasını işaret ediyorsa teknik olarak gerekli değildir, ancak --no-ff seçeneğini belirterek bu birleştirme taahhüdünün oluşturulmasını zorlarsınız. Başlık:Merge branch 'ecc'