Hợp nhất 2 chi nhánh với nhau trong GIT


132

Tôi chỉ mới bắt đầu sử dụng GIT và nghĩ rằng nó tuyệt vời, tuy nhiên tôi hơi bối rối về những gì mergelệnh thực hiện.

Giả sử chúng tôi có một dự án làm việc trong nhánh "A".

Tôi về nhà và thực hiện các thay đổi đối với nhánh này và lưu nó là "B". Một lập trình viên khác thực hiện thay đổi đối với "A" và lưu nó thành "C".

Có cách nào để hợp nhất hai nhánh "B" và "C" với nhau, sau đó xác nhận các thay đổi như một nhánh mới, nói "D" không?

Hoặc đang thiếu điểm 'hợp nhất'?


không cần phải 'lưu thay đổi' trong một nhánh khác. làm việc một chữ A và sau đó hợp nhất các chữ A khác nhau đó lại với nhau
đan

Tôi không làm theo. A sẽ có trên máy tính cục bộ của tôi, dev1 sẽ có bản sao của A trên máy tính của anh ấy và dev2 có bản sao của A trên máy tính của anh ấy. Cả hai nhà phát triển đều thực hiện thay đổi, làm cách nào để kết hợp các thay đổi này với nhau?
dotty

xem < kernel.org/pub/software/scm/git/docs/git-pull.html >. devs lẽ cần phải đẩy / tải lên ở đâu đó kho của họ đầu tiên
knittl

Câu trả lời:


197

merge được sử dụng để mang hai (hoặc nhiều) nhánh lại với nhau.

một ví dụ nhỏ:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

vì vậy bây giờ có ba nhánh riêng biệt (cụ thể là AB và C) với các đầu khác nhau

để chuyển các thay đổi từ B và C trở lại A, hãy kiểm tra A (đã được thực hiện trong ví dụ này) và sau đó sử dụng lệnh hợp nhất:

# create an octopus merge
$ git merge B C

lịch sử của bạn sau đó sẽ giống như sau:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

nếu bạn muốn hợp nhất qua biên giới kho lưu trữ / máy tính, hãy xem git pulllệnh, ví dụ: từ máy tính có nhánh A (ví dụ này sẽ tạo hai cam kết mới):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

điều đó có nghĩa là cả hai nhánh đã thay đổi cùng một đoạn mã. khắc phục sự cố, git add conflicting_filesvà sau đógit commit
đan vào

Nói tệp trong A chứa từ "xin chào", A sửa đổi thành "HELLO" và B sửa thành "Hello world". Kết quả của việc hợp nhất các tệp này là gì?
dotty

Rất tiếc, ý tôi là B đã sửa đổi nó và C đã sửa đổi nó.
dotty

hãy cẩn thận với từ 'sửa đổi' có nghĩa là một cái gì đó khác trong git (thay đổi các cam kết hiện có). Thay đổi tệp 'xin chào' thành 'HELLO' ở một bên và 'Hello World' ở phía bên kia sẽ dẫn đến xung đột hợp nhất
đanttl

19
@dotty: Mặc dù git thường có vẻ giống như phép thuật, nhưng nó thực sự không thể đọc được suy nghĩ của bạn - nếu hai nhánh thực hiện hai thay đổi khác nhau đối với cùng một nội dung, chỉ con người mới có thể tìm ra cách dung hòa chúng. Đó là những gì xung đột hợp nhất là.
Cascabel

48

Nếu bạn muốn hợp nhất các thay đổi trong SubBranch thành MainBranch

  1. bạn nên ở trên MainBranch git checkout MainBranch
  2. sau đó chạy lệnh hợp nhất git merge SubBranch

2
@luckytaxi: Đồng ý, đôi khi ít hơn là nhiều
Marcelo Scofano

Tôi có thể hoàn tác điều này không?
Yohanelly

0

Trường hợp: Nếu bạn cần bỏ qua cam kết hợp nhất được tạo theo mặc định , hãy làm theo các bước sau.

Giả sử, một nhánh tính năng mới được kiểm tra từ cái chính đã có 2 lần cam kết,

  • "Đã thêm A", "Đã thêm B"

Checkout a new feature_branch

  • "Đã thêm C", "Đã thêm D"

Nhánh tính năng sau đó thêm hai cam kết ->

  • "Đã thêm E", "Đã thêm F"

nhập mô tả hình ảnh ở đây

Bây giờ nếu bạn muốn hợp nhất các thay đổi feature_branch thành master, hãy git merge feature_branchngồi trên master.

Điều này sẽ thêm tất cả các cam kết vào nhánh chính (4 trong chính + 2 trong feature_branch = tổng 6) + một cam kết hợp nhất bổ sung giống như 'Merge branch 'feature_branch''khi cái chính được phân kỳ .

Nếu bạn thực sự cần bỏ qua những cam kết này (những cam kết được thực hiện trong FB) và thêm toàn bộ thay đổi được thực hiện trong feature_branch dưới dạng một cam kết duy nhất như 'Integrated feature branch changes into master'Run git merge feature_merge --no-commit.

Với --no-commit, nó thực hiện hợp nhất và dừng ngay trước khi tạo một cam kết hợp nhất, Chúng tôi sẽ có tất cả các thay đổi được bổ sung trong nhánh tính năng ngay bây giờ trong tổng thể và có cơ hội tạo một cam kết mới như của riêng chúng tôi.

Đọc ở đây để biết thêm: https://git-scm.com/docs/git-merge

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.