Đặt lại chi nhánh khác về hiện tại mà không cần thanh toán


110

Tôi đang viết một số tập lệnh cho quy trình làm việc Git của mình.

Tôi cần đặt lại nhánh (hiện có) khác về nhánh hiện tại mà không cần thanh toán.

Trước:

 CurrentBranch: commit A
 OtherBranch: commit B

Sau:

 CurrentBranch: commit A
 OtherBranch: commit A

Tương đương với

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Lưu ý --soft: Tôi không muốn ảnh hưởng đến cây làm việc.)

Điều này có khả thi không?


Có ai biết nếu điều này cũng có thể trong Egit?
zedoo

Câu trả lời:


84

Các quy trình công việc bạn mô tả không tương đương: khi bạn thực hiện reset --hard bạn sẽ mất tất cả các thay đổi trong cây làm việc (bạn có thể muốn thực hiện nó reset --soft).

Những gì bạn cần là

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch

3
Người đàn ông, tôi ước điều này hiệu quả mà không cần thừa refs/heads/
ELLIOTTCABLE

41
Một cách tốt hơn nhiều để làm điều này là git push . current:other. Điều này hoạt động mà không cần refs/heads(/ cc @elliottcable) và nó cũng ngăn bạn cập nhật chi nhánh đã thanh toán. Lưu ý rằng bạn có thể cần phải chuyển -f (hoặc sử dụng +current:other) nếu bản cập nhật không phải là chuyển tiếp nhanh.
Lily Ballard

4
Bạn cũng có thể sử dụng -m 'some text'đối số để ghi lại lý do để cập nhật tham chiếu được hiển thị bằng git reflog OtherBranchlệnh, chẳng hạn như "được đồng bộ hóa với CurrentBranch". Có thể hữu ích để nhớ lý do tại sao bạn làm điều đó sau này.
Levi Haskell

18
Tại sao bạn lại sử dụng git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchhoặc git push . CurrentBranch OtherBranchkhi nào bạn có thể sử dụng công cụ dọn dẹp (IMO) git branch -f OtherBranch CurrentBranch? (Xem câu trả lời của tôi trên nhánh -f git dưới đây)
Colin D Bennett

1
@BenHymers Vì vậy, trang người đàn ông cho "git push" là một lời nói dối chết tiệt. Nó mô tả lệnh là "Cập nhật các tham chiếu từ xa ...". trong khi thực tế, nó có thể cập nhật các tham chiếu cục bộ tốt.
Kaz

228

Đặt otherbranchđể trỏ đến cùng một cam kết như currentbranchbằng cách chạy

git branch -f otherbranch currentbranch

Các -f(lực lượng) tùy chọn bảo git branch vâng, tôi thực sự có nghĩa là ghi đè lên bất kỳ hiện otherbranchtham khảo với cái mới .

Từ tài liệu :

-f
- lực lượng

Đặt lại thành nếu đã tồn tại. Nhánh không -f git từ chối thay đổi nhánh hiện có.


6
Đây là câu trả lời dễ nhất. Cảm ơn!
Robert Karl

Tôi nhận được fatal: Cannot force update the current branch.khi cố gắng làm điều này.
Fuad Saud

4
@FuadSaud đó là vì bạn đã thanh toán otherbranch. Câu hỏi SO này đặc biệt về việc đặt lại một nhánh khác thành một cam kết khác (tức là không đặt lại nhánh đã kiểm tra). Những gì bạn muốn làm là đặt lại chi nhánh hiện tại vớigit reset targetbranch để buộc nhánh hiện tại được trỏ vào targetbranch. Thêm --hardđể cũng buộc cây công việc với nội dung đó. Hoặc --softđể chỉ mục một mình và chỉ thay đổi nhánh của chính nó.
Colin D Bennett

Đúng vậy, tôi biết về thiết lập lại. Những gì tôi đang tìm kiếm là một cách để, trong một thói quen, luôn trỏ local master đến ngược dòng / master, độc lập với những gì đã kiểm tra. Tôi nghĩ branch -fcó thể làm điều đó.
Fuad Saud

9
Imo, đây phải là câu trả lời được chấp nhận. Điều này đã cải thiện quy trình làm việc của tôi rất nhiều!
gây chết người-đàn guitar

23

Bạn có thể đồng bộ hóa với lệnh này các chi nhánh của mình bất kỳ lúc nào

$ git push . CurrentBranch:OtherBranch -f

Ngoài ra nếu không có -f nó thay thế bộ lệnh này

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

Nó có thể hữu ích khi bạn không cần cam kết tất cả các tệp của mình trong CurrentBranch và vì vậy bạn không thể chuyển sang các nhánh khác.


Có thể gây ra "điều khiển từ xa: lỗi: từ chối không tua đi nhanh"
Basilevs

3
Tôi sẽ không bao gồm -ftùy chọn trừ khi nó hoàn toàn không thể tránh khỏi. Nó hoạt động tốt mà không có nó trong trường hợp của tôi.
Melebius,
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.