Cách cam kết thay đổi đối với một chi nhánh mới


150

Tôi chỉ thay đổi một chi nhánh. Làm thế nào tôi có thể cam kết thay đổi cho các chi nhánh khác?

Tôi đang cố gắng sử dụng:

git checkout "the commmit to the changed branch" -b "the other branch"

Tuy nhiên, tôi không nghĩ rằng đây là điều đúng đắn, vì trong trường hợp này tôi đang tạo một chi nhánh mới thay vì cam kết thay đổi thành "chi nhánh khác".

Tôi có nên sử dụng lệnh sau thay thế?

git merge "the other branch"

Chỉ cần một cam kết hay một vài?
Carl Norum

Câu trả lời:


267

git checkout -b your-new-branch

git add <files>

git commit -m <message>

Đầu tiên, kiểm tra chi nhánh mới của bạn. Sau đó thêm tất cả các tệp bạn muốn cam kết dàn dựng. Cuối cùng, cam kết tất cả các tệp bạn vừa thêm. Bạn có thể muốn thực hiện git push origin your-new-branchsau đó để thay đổi của bạn hiển thị trên điều khiển từ xa.


1
kể từ khi tôi nhận được nhánh mới từ git checkout v3.0 (nhánh trước khi tôi thực hiện thay đổi) nhánh mới, tôi vẫn có yêu cầu sử dụng "git add <files>" không?
dùng1988385

Bạn có thể làm một git statusđể xem những gì hiện đang được dàn dựng và những gì không.
John Brodie

5
Tại sao cả hai git addgit commit -a?
Carl Norum

11
Nó không git checkout -b your-new-branchthay thế git checkout your-new-branch?
Schrodinger's'Cat

1
Sẽ thế nào nếu tôi đã theo dõi một tệp và tôi muốn chuyển sang một nhánh mới thêm các tệp đó vào nhánh mới được tạo?
ass-king một số câu hỏi

57

Nếu bạn không cam kết thay đổi

Nếu những thay đổi của bạn tương thích với các chi nhánh khác

Đây là trường hợp từ câu hỏi vì OP muốn cam kết với một nhánh mới và cũng áp dụng nếu các thay đổi của bạn tương thích với nhánh mục tiêu mà không kích hoạt ghi đè.

Như trong câu trả lời được chấp nhận của John Brodie, bạn chỉ cần kiểm tra chi nhánh mới và cam kết công việc:

git checkout -b branch_name
git add <files>
git commit -m "message"

Nếu thay đổi của bạn không tương thích với các chi nhánh khác

Nếu bạn gặp lỗi:

error: Your local changes to the following files would be overwritten by checkout:
...
Please commit your changes or stash them before you switch branches

Sau đó, bạn có thể sắp xếp công việc của mình, tạo một nhánh mới, sau đó bật các thay đổi của nhóm và giải quyết các xung đột:

git stash
git checkout -b branch_name
git stash pop

Sẽ như thể bạn đã thực hiện những thay đổi đó sau khi tạo chi nhánh mới. Sau đó, bạn có thể cam kết như bình thường:

git add <files>
git commit -m "message"

Nếu bạn đã cam kết thay đổi

Nếu bạn muốn giữ các cam kết trong nhánh ban đầu

Xem câu trả lời của Carl Norum với cách hái anh đào, đây là công cụ phù hợp trong trường hợp này:

git checkout <target name>
git cherry-pick <original branch>

Nếu bạn không muốn giữ các cam kết trong nhánh ban đầu

Xem câu trả lời của joeytwiddle về bản sao tiềm năng này . Thực hiện theo bất kỳ bước nào ở trên nếu thích hợp, sau đó cuộn lại nhánh ban đầu:

git branch -f <original branch> <earlier commit id>

Nếu bạn đã đẩy các thay đổi của mình sang một điều khiển từ xa được chia sẻ như GitHub, bạn không nên thử quay lại trừ khi bạn biết bạn đang làm gì.


3
Mọi người hãy thử mã này. Bởi vì hầu hết những người tìm kiếm câu trả lời, họ đã có một số thay đổi trong mã hiện tại của bạn.
Sushin Pv

2
Tại sao bạn thêm stash và stash pop? Khi bạn kiểm tra một chi nhánh mới, các thay đổi của bạn sẽ có sẵn để thêm và cam kết, không cần phải bỏ rác.
Tristan

@Tristan Bạn đúng trong trường hợp các thay đổi tương thích và các tệp không ghi đè lên. Nếu không, tôi nhận được error: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches.Bạn có muốn viết một câu trả lời mới hoặc chỉnh sửa câu trả lời của tôi không? Nếu không, tôi có thể tự chỉnh sửa nó.
Miguelmorin

Ok, bạn hoàn toàn đúng. Tôi nghĩ rằng bạn nên hoàn thành câu trả lời của bạn, để hiển thị những gì nó mang lại ngoài câu trả lời được chấp nhận.
Tristan

@Tristan Tôi đã làm điều đó. OP đã hỏi về một chi nhánh mới, trong trường hợp đó, câu trả lời được chấp nhận là câu trả lời đúng. Tôi giữ cho tôi như những người khác thấy câu trả lời của tôi hữu ích. Nó trở thành một câu trả lời dài và tôi rất vui khi chỉnh sửa với bất kỳ phản hồi nào.
Miguelmorin

24

Nếu tôi hiểu đúng, bạn đã thực hiện một cam kết changed_branchvà bạn muốn sao chép cam kết đó other_branch? Dễ dàng:

git checkout other_branch
git cherry-pick changed_branch

5
Đây là câu trả lời đúng cho những gì anh ta đang cố gắng thực hiện.
Sean
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.