Đẩy cam kết sang chi nhánh khác


384

Có thể cam kết và đẩy các thay đổi từ chi nhánh này sang chi nhánh khác.

Giả sử tôi đã cam kết các thay đổi trong BRANCH1 và muốn đẩy chúng lên BRANCH2 .

Từ BRANCH1 , có hợp lệ để làm không:

git push origin **BRANCH2**

Và sau đó thiết lập lại BRANCH1?

Câu trả lời:


710

Điều đó sẽ gần như làm việc.

Khi đẩy đến một nhánh không mặc định, bạn cần chỉ định ref nguồn và ref đích:

git push origin branch1:branch2

Hoặc là

git push <remote> <branch with new changes>:<branch you are pushing to> 

26
Làm cả hai branch1branch2cần phải ở trên điều khiển từ xa? Điều gì nếu bạn muốn đẩy từ địa phương branch1đến điều khiển từ xa origin branch2?
orad

11
@orad: Không. Phần đầu tiên thực sự chỉ là một định danh cho một cam kết cục bộ; nó thậm chí không cần phải là một chi nhánh.
SLaks

6
@abhisekp: Sử dụng cú pháp tương tự. Để tham khảo chi nhánh nguồn, hãy sử dụng<remote>/<branch>
SLaks

4
@abhisekp: Làm chính xác những gì tôi vừa nói. Chi nhánh hiện tại hoàn toàn không liên quan.
SLaks

21
Hãy nhận biết bất cứ ai bị cám dỗ (như bản thân tôi) chạy theo git push origin :branch2suy nghĩ rằng nó sẽ chỉ đẩy chi nhánh địa phương hiện tại đến điều khiển từ xa branch2, thay vào đó nó sẽ xóa điều khiển từ xa branch2! Cách chính xác là git push origin HEAD:branch2.
Helder Pereira

72

Chắc chắn, mặc dù nó sẽ chỉ hoạt động nếu đó là một chuyển tiếp nhanh của BRANCH2 hoặc nếu bạn buộc nó. Cú pháp đúng để làm một việc như vậy là

git push <remote> <source branch>:<dest branch> 

Xem mô tả của một "refspec" trên trang git đẩy man để biết thêm chi tiết về cách thức hoạt động của nó. Cũng lưu ý rằng cả lực đẩy và thiết lập lại đều là các thao tác "viết lại lịch sử" và không nên cố gắng bởi người yếu tim trừ khi bạn chắc chắn biết bạn đang làm gì đối với bất kỳ kho lưu trữ từ xa nào khác những người có dĩa / bản sao của cùng một dự án.


6
Cảm ơn! Tôi sẽ chỉ thêm rằng bạn có thể ép buộc git push --force remote local-branch:remote-branch.
Ferran Maylinch

16

Nó rất đơn giản. Giả sử rằng bạn đã thực hiện các thay đổi đối với Chi nhánh A cư trú ở cả địa phương và từ xa nhưng bạn muốn đẩy các thay đổi này đến Chi nhánh B không tồn tại ở bất kỳ đâu.

Bước-01: tạo và chuyển sang nhánh B mới

kiểm tra git -b B

Bước-02: Thêm thay đổi trong nhánh cục bộ mới

git thêm. // hoặc tập tin cụ thể

Bước 03: Cam kết thay đổi

git commit -m "commit_message"

Bước-04: Đẩy các thay đổi sang nhánh B mới . Lệnh dưới đây sẽ tạo một nhánh B mới từ xa

git đẩy nguồn gốc B

Bây giờ, bạn có thể xác minh từ bitbucket rằng chi nhánh B sẽ có thêm một cam kết hơn chi nhánh Một . Và khi bạn sẽ kiểm tra các chi nhánh Một những thay đổi này sẽ không có mặt ở đó vì đây đã được đẩy vào chi nhánh B .

Lưu ý: Nếu bạn đã cam kết các thay đổi của mình vào nhánh A và sau đó bạn muốn chuyển các thay đổi đó sang nhánh B mới thì bạn sẽ phải đặt lại các thay đổi đó trước. #HappyLearning


2

Trong trường hợp của tôi, tôi đã có một cam kết địa phương, không được thúc đẩy origin\master, nhưng đã cam kết với masterchi nhánh địa phương của tôi . Cam kết cục bộ này nên được đẩy sang một chi nhánh khác.

Với tiện ích mở rộng Git, bạn có thể làm một cái gì đó như thế này:

  • (Tạo nếu không tồn tại và) kiểm tra chi nhánh mới, nơi bạn muốn đẩy cam kết của mình.
  • Chọn cam kết từ lịch sử, sẽ được cam kết & đẩy đến chi nhánh này.
  • Nhấp chuột phải và chọn Cherry pick commit .
  • Nhấn nút chọn Cherry sau đó.
  • Cam kết đã chọn được áp dụng cho chi nhánh đã kiểm tra của bạn. Bây giờ cam kết và đẩy nó.
  • Kiểm tra chi nhánh cũ của bạn, với cam kết bị lỗi.
  • Hard thiết lập lại chi nhánh này đến lần xác nhận cuối cùng thứ hai, nơi mọi thứ đều ổn (lưu ý bạn đang làm gì ở đây!). Bạn có thể làm điều đó thông qua nhấp chuột phải vào lần xác nhận cuối cùng thứ hai và chọn Đặt lại chi nhánh hiện tại vào đây . Xác nhận sự thay đổi, nếu bạn biết những gì bạn đang làm.

Bạn cũng có thể làm điều đó trên dòng lệnh GIT . Ví dụ được sao chép từ David Christensen :

Tôi nghĩ bạn sẽ thấy git cherry-pick+ git resetlà một quy trình làm việc nhanh hơn nhiều:

Sử dụng cùng một kịch bản của bạn, với "tính năng" là nhánh có cam kết cao nhất là không chính xác, sẽ dễ dàng hơn nhiều để làm điều này:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

Tiết kiệm khá nhiều công việc, và là kịch bản git cherry-pick được thiết kế để xử lý.

Tôi cũng sẽ lưu ý rằng điều này cũng sẽ hoạt động nếu nó không phải là cam kết cao nhất; bạn chỉ cần một cam kết cho đối số để chọn cherry, thông qua:

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history


2

Tôi đã nhận được một kết quả xấu với git push origin branch1:branch2lệnh:

Trong trường hợp của tôi, branch2đã bị xóa và branch1đã được cập nhật với một số thay đổi mới.

Do đó, nếu bạn chỉ muốn các thay đổi thúc đẩy branch2từ branch1, hãy thử các quy trình dưới đây:

  • Vào branch1:git add .
  • Vào branch1:git commit -m 'comments'
  • Vào branch1:git push origin branch1

  • Vào branch2:git pull origin branch1

  • On branch1: trở lại cam kết trước đó.


0

bạn có thể làm điều này một cách dễ dàng

git status
git add .
git commit -m "any commit"
git pull origin (branch name, master in my case)
git push origin current branch(master):branch 2(development)(in which you want to push changes)

-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  


1
Vui lòng thêm một số giải thích về mã.
Nakx

-4

Bạn đã cam kết với BRANCH1 và muốn thoát khỏi cam kết này mà không mất các thay đổi? git reset là những gì bạn cần. Làm:

git branch BRANCH2

nếu bạn muốn BRANCH2 là một chi nhánh mới. Bạn cũng có thể hợp nhất cái này ở cuối với một nhánh khác nếu bạn muốn. Nếu BRANCH2 đã tồn tại, thì hãy bỏ bước này ra.

Sau đó làm:

git reset --hard HEAD~3

nếu bạn muốn đặt lại cam kết trên nhánh bạn đã cam kết. Điều này có những thay đổi của ba cam kết cuối cùng.

Sau đó thực hiện các thao tác sau để mang lại các cam kết được đặt lại cho BRANCH2

git checkout BRANCH2

Nguồn này rất hữu ích: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

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.