Bir dalı hızlı bir şekilde nasıl yönlendirebilirim?


249

Uzun süre bir dalda geliştirdikten sonra ustalaştım. Günlükte şunlar gösterilir:

Şubeniz 167 taahhütte 'orijin / master' ın arkasındadır ve hızlı bir şekilde iletilebilir.

Denedim:

git checkout HEAD

Etkisi yok. Bunun nedeni, master konusunda bir ara taahhüdüm var.

Ustanın kafasına nasıl kalmasını sağlar?


6
git checkout HEADasla hiçbir şey yapmaz. HEADzaten teslim alma anlamına gelir.
Emre Tapcı

Yanıtlar:


244

Yapma:

git checkout master
git pull origin

origin/masterdalı getirir ve birleştirir (yalnızca git pullbaşlangıç ​​kaynağı varsayılan olarak diyebilirsiniz ).


52
Bence Rob'un cevabı daha iyi. Genellikle çekmeyi bitirdiğim bu durumla karşılaşıyorum ve sonra hızlı bir şekilde iletilmesi gereken farklı bir şubeye geçiyorum. Başka bir (op-op) çekme yapmak ve tamamlanmasını beklemek zorunda kalırsam bana sinir bozucu; yalnızca yerel bir işlem yapmak daha hızlıdır ve yine de istediğim şey budur.
Baron Schwartz

354

Deneyin git merge origin/master. Bunun yalnızca bir hızlı ileri sarma yaptığından emin olmak istiyorsanız, söyleyebilirsiniz git merge --ff-only origin/master.


4
Bu, uzaktan kumandanızda atlamak için bazı kimlik doğrulama halkaları olduğunda kullanmak güzeldir. Bir dalı çektiğimde kimlik doğrulamam gerekiyor. Sonra, başka bir şubeye geçtiğimde (yani, değişiklikleri almak için), mergeyeniden doğrulamak zorunda kalmamam için bu komutu kullanmayı tercih ederim .
RustyTheBoyRobot

30
--ff-onlyson derece kullanışlıdır.
Luke

4
origin/masterParçanın gerekli olup olmadığını veya mantıklı bir şekilde varsayılan olup olmadığını bilmiyorum , ancak hızlı ileriye doğru bir takma ad oluşturmayı yararlı buldum, bu yüzden yukarı doğru dalın onu sabit kodlamak yerine kullanıldığından emin olmak istedim origin/master: ff = merge --ff-only @{u}( @{u}yukarı doğru) .
Thor84no

2
Çevrimdışı iseniz önerilen cevaptan daha iyi
Jacek Pietal

1
Basit bir çekmenin neden aynı şeyi yapmadığını açıklayabilir misiniz? Ayrıca, bunu yaparsak çekme hala gerekli mi?
Zuzu Corneliu

40

Durumunda git rebase, hile de yapardı. Master'ın sahip olmadığı hiçbir değişiklik olmadığından git sadece hızlı ilerleyecektir. Eğer bir rebase iş akışı ile çalışıyorsanız, bu daha tavsiye edilebilir, zira karışıklık yaparsanız bir birleştirme taahhüdü ile sonuçlanmazsınız.

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean

1
Ve git çek kullanmamız gerekmediği için benim için çok yararlı!
Stefan

Bekleyen bir değişiklik olsa bile, her zaman saklayabilir ve yeniden başlatabilirsiniz, bunun 'uygun' yol olup olmadığını bilmiyorum ama harikalar yaratıyor.
fn.

28
git checkout master
git pull

işi yapmalı.

Master'dan farklı bir dalda her çalıştığınızda "Şubeniz geride" mesajını alacaksınız , birisi master'da değişiklik yapıyor ve git pull.

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

Şimdi kökeni / ana referans çekilir, ancak usta olan birleştirilmez onunla

(branch) $ git checkout master
(master) $ 

şimdi master menşe / master'ın arkasındadır ve hızlı bir şekilde iletilebilir

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

şimdi ustanız ve kaynağınız / ustanız senkronize


13

Farklı bir dalda duruyorsanız ve master'ın en yeni versiyonunu kontrol etmek istiyorsanız,

git checkout -B master origin/master


9

Hızlı İletmek isteyen herkese, o dalı kontrol etmeden başka bir uzak dalda (kendisi de dahil olmak üzere) değillerdir :

git fetch origin master:other

Bu temelde hızlı ileri endeks otheriçin origin/mastersize değilseniz otherdalı. Bu şekilde birden çok dalı hızlı ileri alabilirsiniz.

Bir süre başka bir dalda çalışıyorsanız ve eski dalları uzaklardan ilgili kafalarına güncellemek istiyorsanız:

git fetch origin master:master other:other etc:etc

2

Hiçbir karmaşıklık sadece dalında durun ve benim için çalıştı bir git çekme yapmak

Ya da, ikinci komut olarak sadece ilk komuttan şanssızsanız git pull origin master'ı deneyin


0

To rebase güncel yerel izci son uzaktan devletin tepesinde yerel değişiklikler hareketli şube:

$ git fetch && git rebase

Daha genel olarak, yerel değişiklikleri hızlı ileri sarmak ve bırakmak için ( donanımdan sıfırlama ) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

için hızlı ileri ve yerel değişiklikleri (tutmak Rebase ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - Kasıtsız sabit sıfırlamanın neden olduğu değişikliği geri almak için önce git reflogHEAD durumunu ters sırayla görüntüler, sıfırlama işleminden önce HEAD'ın işaret ettiği karmayı bulun (genellikle açıktır) ve dalı bu karmaya sabit sıfırlayın.


0

Sizin durumunuzda, hızlı ileri sarmak için şunu çalıştırın:

$ git merge --ff-only origin/master

Bu soru, özellikle "hızlı ileri sar" istediği için --ff-onlyseçeneğini kullanır git merge.

İşte git-merge(1)daha hızlı ileri seçenekler gösteren bir alıntı :

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

Bir takma adı gerektirecek kadar hızlı ileri sarıyorum:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

Şimdi bunu hızlı ileri almak için çalıştırabilirim:

$ git ff

-2

Şube işaretçinizi HEAD'a getirin:

git branch -f master

Sizin şube mastergit kullandığınız sürece ..., üzerine yazmak izin vermez böylece zaten var olan -f(bu argüman açılımı --force)

Veya rebase'i kullanabilirsiniz:

git rebase HEAD master

Kendi sorumluluğunuzdadır;)


1
Bunu denemeyin. eğer aşağıdaki durumunuz varsa kötü şeyler olacaktır: C0 --- C1 --- C2 --- C3 --- C4 (master). C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) Kafanız B3 (dev) konumundaysa ve git -f master git git, C0 - - C1 - C2 - B1 - B2 - B3 (dev) (master). C3 --- C4'e herhangi bir şubeden ulaşılamaz ve sonunda çöp toplanır. Kendinizi bu durumda bulursanız, yeni bir şube oluşturmak için -b <branch> seçeneği ile reflog ve check-out C4'e bakın.
A_P
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.