Làm thế nào để nhanh chóng chuyển tiếp một chi nhánh để đứng đầu?


249

Tôi chuyển sang làm chủ sau khi phát triển trên một chi nhánh trong một thời gian dài. Nhật ký hiển thị:

Chi nhánh của bạn đứng sau 'origin / master' bởi 167 lần xác nhận và có thể được chuyển tiếp nhanh.

Tôi đã thử:

git checkout HEAD

Nó không có tác dụng. Điều này là do tôi đã kiểm tra một cam kết trung gian trên chủ.

Làm thế nào để làm chủ ở lại trên đầu?


6
git checkout HEADkhông bao giờ làm bất cứ điều gì HEADđã có nghĩa là cam kết thanh toán.
Emre Tapcı

Câu trả lời:


244

Đang làm:

git checkout master
git pull origin

sẽ tìm nạp và hợp nhất origin/masterchi nhánh (bạn có thể nói rằng git pullnguồn gốc là mặc định).


52
Tôi nghĩ câu trả lời của Rob là tốt hơn. Tôi thường gặp tình huống này khi tôi vừa kéo xong và sau đó tôi chuyển sang một nhánh khác, cần phải được chuyển nhanh. Thật khó chịu với tôi nếu tôi phải thực hiện một động tác kéo (không hoạt động) khác và chờ đợi nó hoàn thành; thực hiện một hoạt động chỉ cục bộ là nhanh hơn và dù sao tôi cũng muốn.
tước Schwartz

353

Hãy thử git merge origin/master. Nếu bạn muốn chắc chắn rằng nó chỉ thực hiện nhanh chóng, bạn có thể nói git merge --ff-only origin/master.


4
Điều này là tốt để sử dụng khi điều khiển từ xa của bạn có một số vòng xác thực để nhảy qua. Khi tôi kéo vào một nhánh, tôi phải xác thực. Sau đó, khi tôi chuyển sang một chi nhánh khác (nghĩa là chọn cherry thay đổi), tôi thích sử dụng mergelệnh này để tôi không phải xác thực lại.
RustyTheBoyRobot

30
--ff-onlylà vô cùng hữu ích.
Lu-ca

4
Tôi không biết nếu origin/masterphần đó là bắt buộc hoặc nếu nó mặc định hợp lý, nhưng tôi thấy nó hữu ích để tạo bí danh để chuyển tiếp nhanh vì vậy tôi muốn đảm bảo rằng nhánh ngược dòng được sử dụng thay vì mã hóa cứng để origin/master: ff = merge --ff-only @{u}( @{u}là ngược dòng) .
Thor84no

2
đó là tốt hơn so với câu trả lời được đề xuất nếu bạn ngoại tuyến
Jacek Pietal

1
Bạn có thể giải thích tại sao một cái kéo đơn giản không làm điều tương tự? Ngoài ra, kéo vẫn cần thiết nếu chúng ta làm điều này?
Zuzu Corneliu

40

Trong tình huống của bạn, git rebasecũng sẽ làm các mẹo. Vì bạn không có thay đổi nào mà chủ nhân không có, git sẽ chỉ chuyển tiếp nhanh. Nếu bạn đang làm việc với một quy trình làm việc rebase, điều đó có thể được khuyến khích hơn, vì bạn sẽ không kết thúc với một cam kết hợp nhất nếu bạn làm hỏng.

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
Và rất hữu ích cho tôi vì chúng tôi không phải sử dụng git pull!
Stefan

Ngay cả khi bạn có một số thay đổi đang chờ xử lý, bạn luôn có thể stash và rebase, tôi không biết liệu đây có phải là cách 'phù hợp' hay không nhưng vẫn hoạt động kỳ diệu.
fn.

28
git checkout master
git pull

nên làm công việc.

Bạn sẽ nhận được thông báo "Chi nhánh của bạn đứng sau" mỗi khi bạn làm việc trên một chi nhánh khác với chủ , ai đó sẽ thay đổi thành chủ và bạn git pull.

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

bây giờ tham chiếu gốc / chủ được kéo, nhưng chủ của bạn không được hợp nhất với nó

(branch) $ git checkout master
(master) $ 

bây giờ chủ đứng sau nguồn gốc / chủ và có thể được chuyển tiếp nhanh

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

bây giờ chủ và gốc / chủ của bạn được đồng bộ hóa


13

Nếu bạn đang đứng trên một nhánh khác và muốn kiểm tra phiên bản chính mới nhất, bạn cũng có thể làm

git checkout -B master origin/master


9

Đối với bất kỳ ai muốn Chuyển tiếp nhanh, họ không tham gia vào một chi nhánh từ xa khác (bao gồm cả chính nó) mà không cần kiểm tra chi nhánh đó, bạn có thể làm:

git fetch origin master:other

Này về cơ bản nhanh chóng chuyển tiếp các chỉ số otherđể origin/masternếu bạn không sử dụng otherchi nhánh. Bạn có thể nhanh chóng chuyển tiếp nhiều chi nhánh theo cách này.

Nếu bạn làm việc trên một chi nhánh khác một thời gian và muốn cập nhật các chi nhánh cũ từ xa lên đầu tương ứng của họ:

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

2

Không có sự phức tạp cần thiết chỉ cần đứng tại chi nhánh của bạn và thực hiện một động tác git nó làm việc cho tôi

Hoặc, như một lần thử thứ hai git pull origin master chỉ trong trường hợp nếu bạn không may mắn với lệnh đầu tiên


0

Để rebase các hiện địa phương theo dõi chi nhánh di chuyển thay đổi địa phương trên đầu trang của nhà nước từ xa mới nhất:

$ git fetch && git rebase

Nói chung, để chuyển tiếp nhanh và bỏ các thay đổi cục bộ ( thiết lập lại cứng ) *:

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

để chuyển tiếp nhanh và giữ các thay đổi cục bộ ( rebase ):

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

* - để hoàn tác thay đổi gây ra bởi thiết lập lại cứng không cố ý trước tiên git reflog, hiển thị trạng thái của ĐẦU theo thứ tự ngược lại, tìm hàm băm mà ĐẦU đã trỏ đến trước thao tác đặt lại (thường là rõ ràng) và cứng đặt lại nhánh vào hàm băm đó.


0

Trong trường hợp của bạn, để chuyển tiếp nhanh, hãy chạy:

$ git merge --ff-only origin/master

Điều này sử dụng --ff-onlytùy chọn git merge, như câu hỏi đặc biệt yêu cầu "chuyển tiếp nhanh".

Đây là một đoạn trích từ git-merge(1)đó cho thấy nhiều tùy chọn chuyển tiếp nhanh hơn:

--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.

Tôi nhanh chóng chuyển tiếp đủ để nó bảo đảm một bí danh:

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

Bây giờ tôi có thể chạy nó để chuyển tiếp nhanh:

$ git ff

-2

Di chuyển con trỏ nhánh của bạn đến ĐẦU:

git branch -f master

Chi nhánh của bạn masterđã tồn tại, vì vậy git sẽ không cho phép bạn ghi đè lên nó, trừ khi bạn sử dụng ... -f(đối số này là viết tắt của --force)

Hoặc bạn có thể sử dụng rebase:

git rebase HEAD master

Làm điều đó với rủi ro của riêng bạn;)


1
Đừng cố gắng này. nếu bạn có tình huống xấu sau đây sẽ xảy ra: C0 --- C1 --- C2 --- C3 --- C4 (chủ). C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) Nếu Head của bạn ở B3 (dev) và bạn làm chủ git chi nhánh -f, bạn sẽ kết thúc với C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (chính). C3 --- C4 không thể truy cập từ bất kỳ chi nhánh nào và cuối cùng sẽ được thu gom rác. Nếu bạn thấy mình trong tình huống này, hãy xem reflog và kiểm tra cam kết C4 với tùy chọn -b <Branch> để tạo một nhánh mới.
A_P
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.