Kéo git kéo hay hoặc git hợp nhất giữa các nhánh chính và phát triển


243

Tôi có masterchi nhánh của tôi và một developchi nhánh để làm việc với một vài thay đổi. Tôi cần hợp nhất các thay đổi từ mastervào develop, nhưng cuối cùng sẽ hợp nhất mọi thứ từ developvàomaster . Tôi có hai quy trình làm việc khác nhau trong tâm trí:

  1. git pull origin master vào develop chi nhánh
  2. git merge master vào develop chi nhánh

Đó là cách tốt nhất để làm điều này, và tại sao?



2
git pull= git fetch+git merge FETCH_HEAD
Yousha Aleayoub

Câu trả lời:


104

Hãy cẩn thận với rebase. Nếu bạn đang chia sẻ chi nhánh phát triển của mình với bất kỳ ai, rebase có thể tạo ra một mớ hỗn độn. Rebase chỉ tốt cho các chi nhánh địa phương của bạn.

Quy tắc ngón tay cái, nếu bạn đã đẩy chi nhánh về nguồn gốc, đừng sử dụng rebase. Thay vào đó, sử dụng hợp nhất.


Tuy nhiên, nó có an toàn để rebase và git push origin rebasedBranch --forcetrên một repo tư nhân? Người dùng duy nhất là chính tôi.
k0pernikus

Có, nếu bạn là người dùng duy nhất, tất nhiên nó an toàn. Tôi sử dụng git đẩy - lực lượng mọi lúc khi tôi là người dùng duy nhất. :)
Tyler Rick

3
Tôi lặp lại cảnh báo của Eric. Mặc dù, nó cũng hoàn toàn ổn khi khởi động lại chi nhánh từ xa của riêng bạn. Chơi xung quanh với cả rebase và merge và bạn sẽ hiểu những ưu và nhược điểm của từng loại và tìm hiểu khi sử dụng chúng.
Ian Lotinsky

Bài viết hay về sử dụng rebase, thậm chí hợp nhất sau khi giải quyết xung đột: github.com/everpix/Everpix-Intellect
Ian Lotinsky

@IanLotinsky liên kết của bạn không trỏ đến một bài viết về rebase. Longshot, nhưng bạn vẫn có liên kết chính xác? :)
Daniel Serodio

347

Quy trình làm việc này tốt nhất cho tôi:

git checkout -b develop

... thực hiện một số thay đổi ...

... thông báo tổng thể đã được cập nhật ...

... cam kết thay đổi để phát triển ...

git checkout master
git pull

... Đưa những thay đổi đó trở lại phát triển ...

git checkout develop
git rebase master

... thực hiện một số thay đổi nữa ...

... Cam kết họ phát triển ...

... hợp nhất chúng thành chủ ...

git checkout master
git pull
git merge develop

2
Đây là cách tôi làm việc quá, và tôi thấy nó hoạt động tốt. Có một điều tôi không làm, và đó là git pullquyền trước trận chung kết git merge develop. Mục đích của việc đó là gì?
crdx

Sau khi ... thông báo tổng thể đã được cập nhật ... một phần, chủ thanh toán sẽ xóa các thay đổi cục bộ của bạn để phát triển nếu bạn không cam kết chúng?
a1an

1
@ a1an Không, nhưng nếu bạn không cam kết thì các thay đổi sẽ chuyển sang nhánh chính và git sẽ không cho phép bạn kéo cho đến khi chúng được cam kết.
elemjay19

5
@crdx Rất có thể các chi nhánh khác được hợp nhất với chủ từ xa trước khi bạn hợp nhất chi nhánh của mình với chủ địa phương. Bạn kéo và mang các thay đổi chủ từ xa đến bản sao chính của bạn. Đây là cách tôi hiểu nó.
Tarun

12
git pull --rebase origin mastertrên nhánh phát triển của bạn nhanh hơn một chút.
Nathan Lilienthal

24

Cách tiếp cận tốt nhất cho loại điều này có lẽ là git rebase. Nó cho phép bạn kéo các thay đổi từ chủ vào nhánh phát triển của mình, nhưng để tất cả công việc phát triển của bạn "ở trên cùng" (sau này trong nhật ký cam kết) các công cụ từ chủ. Khi công việc mới của bạn hoàn tất, việc hợp nhất trở lại thành chủ sau đó rất đơn giản.


10
Lời khuyên tốt, giả sử developkhông được chia sẻ với bất cứ ai khác.
Karl Bielefeldt

1
@KarlBielefeldt Nếu develop được chia sẻ với những người đóng góp khác, chúng tôi sẽ cập nhật như thế nào developkhi một số hotfix được đẩy trực tiếp vào master? Chúng ta có nên làm một sự hợp nhất, tức là git checkout master && git pull --rebase && git checkout develop && git merge master? Tôi đã để lại một bình luận về câu trả lời được bình chọn cao nhất ở trên, trong đó cũng nêu chi tiết mối quan tâm này.
modulitos

5

Nếu bạn không chia sẻ phát triển chi nhánh với bất kỳ ai, thì tôi sẽ chỉ khởi động lại mỗi khi cập nhật chính, theo cách đó bạn sẽ không hợp nhất tất cả các lịch sử của mình một khi bạn sẽ hợp nhất phát triển trở lại thành chủ. Quy trình làm việc trong trường hợp này sẽ như sau:

> git clone git://<remote_repo_path>/ <local_repo>
> cd <local_repo>
> git checkout -b develop
....do a lot of work on develop
....do all the commits
> git pull origin master
> git rebase master develop

Các bước trên sẽ đảm bảo rằng nhánh phát triển của bạn sẽ luôn nằm trong top những thay đổi mới nhất từ ​​nhánh chính. Khi bạn đã hoàn thành với nhánh phát triển và nó được chuyển sang các thay đổi mới nhất trên bản gốc, bạn có thể hợp nhất lại:

> git checkout -b master
> git merge develop
> git branch -d develop

1

quy tắc của tôi là:

rebaseđối với các chi nhánh có cùng tên , mergenếu không.

ví dụ cho cùng tên sẽ là master, origin/masterotherRemote/master.

nếu developchỉ tồn tại trong kho lưu trữ cục bộ và nó luôn dựa trên một origin/mastercam kết gần đây , bạn nên gọi nó mastervà làm việc trực tiếp tại đó. nó đơn giản hóa cuộc sống của bạn và trình bày mọi thứ như thực tế: bạn đang trực tiếp phát triển trên masterchi nhánh.

nếu developđược chia sẻ, nó không nên bị từ chối master, chỉ cần sáp nhập lại với nó --no-ff. bạn đang phát triển trên develop. masterdevelopcó tên khác nhau, bởi vì chúng tôi muốn chúng là những thứ khác nhau, và tách biệt. đừng làm cho chúng giống với rebase.

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.