Git và Lốc nhánh 'x' không được hợp nhất hoàn toàn Lỗi Lỗi


294

Dưới đây là các lệnh tôi đã sử dụng từ nhánh chính

git branch experiment
git checkout experiment

Sau đó, tôi đã thực hiện một số thay đổi cho các tệp của mình, cam kết các thay đổi và đẩy chi nhánh mới sang GitHub.

git commit . -m 'changed files'
git push -u origin experiment

Sau này tôi quyết định hợp nhất nhánh thử nghiệm của mình vào nhánh chính.

git checkout master
git merge experiment

Cuối cùng tôi đã đẩy các thay đổi sang GitHub.

git push -u origin master

Tất cả đều diễn ra tốt đẹp cho đến khi tôi cố gắng xóa chi nhánh thử nghiệm của mình bằng cách sử dụng

git branch -d experiment

Tôi nhận được thông báo lỗi error: The branch 'experiment' is not fully merged.Tôi hơi mới với git và tôi không biết mình có thể hợp nhất hai chi nhánh đến mức nào. Tôi đang thiếu gì ở đây?


2
Bài đăng này có giúp gì cho bạn không? stackoverflow.com/questions/1710894/
Mạnh

2
Điều này đôi khi xuất hiện khi tôi thực hiệngit commit --amend
Arcolye

12
Ngoài ra - Hãy chú ý rằng thông báo này sẽ xuất hiện sau squash: stackoverflow.com/q/41946475/109941
Jim G.

Tôi nghĩ kịch bản phổ biến nhất là, bạn chỉ cần kéo các thay đổi mới được hợp nhất của mình trước khi xóa chi nhánh cục bộ.
RaisinBranCrunch

Câu trả lời:


313

Lưu ý Từ ngữ thay đổi để đáp ứng với các cam kết. Cảm ơn @slekse
Đó không phải là một lỗi, đó là một cảnh báo. Điều đó có nghĩa là chi nhánh bạn sắp xóa có chứa các cam kết không thể truy cập được từ bất kỳ: chi nhánh ngược dòng hoặc CHÍNH (hiện đã được kiểm tra sửa đổi). Nói cách khác, khi bạn có thể mất các cam kết¹.

Trong thực tế, điều đó có nghĩa là bạn có thể đã sửa đổi, từ chối hoặc lọc các cam kết và chúng dường như không giống nhau.

Do đó, bạn có thể tránh cảnh báo bằng cách kiểm tra một nhánh có chứa các cam kết mà bạn sắp không tham chiếu bằng cách xóa nhánh đó.²

Bạn sẽ muốn xác minh rằng trên thực tế bạn không thiếu bất kỳ cam kết quan trọng nào:

git log --graph --left-right --cherry-pick --oneline master...experiment

Điều này sẽ cung cấp cho bạn một danh sách của bất kỳ vô nghĩa giữa các chi nhánh. Trong trường hợp bạn tò mò, có thể có một sự khác biệt mà không có --cherry-pickvà sự khác biệt này cũng có thể là lý do cho cảnh báo bạn nhận được:

--cherry-pick

Bỏ qua bất kỳ cam kết nào đưa ra cùng một thay đổi như một cam kết khác ở "phía bên kia" khi tập hợp các cam kết bị giới hạn với sự khác biệt đối xứng. Ví dụ: nếu bạn có hai nhánh A và B, một cách thông thường để liệt kê tất cả các cam kết chỉ trên một mặt của chúng là với --left-right, giống như ví dụ ở trên trong mô tả về tùy chọn đó. Tuy nhiên, nó cho thấy các cam kết được chọn từ anh đào từ chi nhánh khác (ví dụ: "thứ 3 trên b" có thể được chọn từ anh đào từ chi nhánh A). Với tùy chọn này, các cặp xác nhận như vậy được loại trừ khỏi đầu ra.


Default Theo mặc định, chúng thực sự chỉ được thu gom rác. Ngoài ra, git-branchlệnh không kiểm tra cây sửa đổi của tất cả các nhánh . Cảnh báo là có để tránh những sai lầm rõ ràng.

² (Sở thích của tôi ở đây là chỉ buộc xóa, nhưng bạn có thể muốn có thêm sự yên tâm).


24
Cảm ơn. Cụm từ chính là "chứa các cam kết không thể truy cập được từ bất kỳ đầu ref nào khác". Mặc dù tôi không còn cần đến nhánh thử nghiệm nữa và đã hợp nhất nó thành chủ và dự định xóa nó khỏi nguồn gốc, git sẽ không vui cho đến khi tôi đẩy các thay đổi sang thử nghiệm. Tôi đoán cảnh báo này là một kiểm tra vệ sinh của các loại.
gió mùa

35
-1 "Điều đó có nghĩa là nhánh bạn sắp xóa chứa các xác nhận không thể truy cập được từ bất kỳ đầu ref nào khác." Điều này LAF không đúng. Cảnh báo có nghĩa là nhánh không thể truy cập được từ thượng nguồn của nó (nếu có) hoặc từ ĐẦU hiện tại. Xem trang của chi nhánh git.
sleske

3
@TachyonVortex Liên kết đẹp. Lệnh git nhánh -vv thực sự làm rõ những gì đang xảy ra với tôi.
Jason Massey

11
@sleske Cảm ơn bạn đã bình luận - câu trả lời này thực sự nên được chỉnh sửa. Thật xấu hổ vì nó được đánh giá cao vì câu giải thích chính là không chính xác. Tôi vừa gặp vấn đề này và đã trải qua một thời gian dài khó chịu khi cố gắng tìm hiểu vấn đề là gì, và chỉ là chi nhánh theo dõi từ xa đã bị xóa như một phần của yêu cầu kéo và trong thời gian kể từ khi tôi rút các thay đổi từ chủ trên chi nhánh địa phương. "Vấn đề" duy nhất là không tìm thấy nhánh theo dõi từ xa đã bị xóa (và tôi đã cố gắng xóa nhánh cục bộ vì lý do tương tự).
ely

3
Vâng, điều này có thể xảy ra chỉ khi cố gắng xóa một nhánh cục bộ nếu bạn ở một nhánh khác với nhánh bạn đã tạo khi bạn tạo nó. "Các cam kết không thể truy cập từ bất kỳ giới thiệu nào khác" là không chính xác và đáng sợ!
Amalgovinus

80

Như Drew Taylor đã chỉ ra, việc xóa chi nhánh với -d chỉ xem xét CHÍNH hiện tại trong việc xác định xem chi nhánh có được "hợp nhất hoàn toàn" hay không. Nó sẽ khiếu nại ngay cả khi chi nhánh được sáp nhập với một số chi nhánh khác. Thông báo lỗi chắc chắn có thể rõ ràng hơn về vấn đề này ... Bạn có thể kiểm tra nhánh đã hợp nhất trước khi xóa hoặc chỉ sử dụng nhánh git -D. Vốn -D sẽ ghi đè hoàn toàn kiểm tra.


2
Phần về CHÍNH hiện tại đã sửa nó cho tôi. Chủ nhân của tôi khác với nhánh tính năng mà tôi đã tạo ra nhánh xung đột: D
viki.omega9

1
Đối với ai đó học git, từ "hiện tại" có vẻ dư thừa với "ĐẦU"? Không có những điều như một TRỤ uncurrent - các HEAD theo định nghĩa sự hiện chi nhánh. Tui bỏ lỡ điều gì vậy? Tôi cho rằng bạn có thể nói "chi nhánh hiện tại" hoặc "ĐẦU" chứ không phải "hiện tại".
Mark Lakata

Có cách nào để thay đổi / định cấu hình này không (ví dụ: có phải luôn luôn kiểm tra origin/masterkhông?) Tôi đoán rằng việc kiểm tra origin/mastertrước tiên không quá khó chịu, nhưng nó chỉ cảm thấy giống như một dòng chảy kỳ lạ - tại sao tôi cần kiểm tra origin/mastercục bộ chỉ để bạn xác minh rằng những thay đổi của tôi được hợp nhất ở đó?
Alec

15

Tôi đã thử câu trả lời của sehe và nó không hoạt động.

Để tìm các cam kết chưa được hợp nhất, chỉ cần sử dụng:

git log feature-branch ^master --no-merges

14

Tôi đã có điều này xảy ra với tôi ngày hôm nay, khi tôi đang hợp nhất nhánh tính năng đầu tiên của mình trở lại thành chủ. Như một số người đã nói trong một chủ đề khác trên SO, thủ thuật đã chuyển trở lại thành chủ trước khi cố gắng xóa chi nhánh. Khi trở lại chủ, git rất vui khi xóa chi nhánh mà không có bất kỳ cảnh báo nào.


7
Có vẻ như đó không phải là vấn đề cụ thể ở đây, nhưng tôi đã gặp phải vấn đề mà bạn mô tả vừa rồi, cảm ơn!
Daniel Buckmaster

4

Git đang cảnh báo rằng bạn có thể mất lịch sử bằng cách xóa chi nhánh này. Mặc dù nó sẽ không thực sự xóa bất kỳ cam kết nào ngay lập tức, một số hoặc tất cả các cam kết trên chi nhánh sẽ không thể truy cập được nếu chúng không phải là một phần của một số chi nhánh khác.

Để chi nhánh experimentđược sáp nhập hoàn toàn vào một chi nhánh khác, cam kết tiền tip của nó phải là tổ tiên của đầu chi nhánh khác, thực hiện các cam kết trong experimentmột tập hợp con của chi nhánh khác. Điều này làm cho nó an toàn để xóa experiment, vì tất cả các cam kết của nó sẽ vẫn là một phần của lịch sử kho lưu trữ thông qua các chi nhánh khác. Nó phải được sáp nhập hoàn toàn, vì nó có thể đã được hợp nhất nhiều lần, nhưng bây giờ đã có các cam kết được thêm vào kể từ lần hợp nhất cuối cùng không có trong nhánh khác.

Git không kiểm tra tất cả các chi nhánh khác trong kho lưu trữ; chỉ hai:

  1. Chi nhánh hiện tại (CHÍNH)
  2. Nhánh ngược dòng, nếu có một

Có thể là chi nhánh thượng nguồn của người Viking experiment, như trong trường hợp của bạn origin/experiment. Nếu experimentđược hợp nhất hoàn toàn trong nhánh hiện tại, thì Git sẽ xóa nó mà không có khiếu nại. Nếu không, nhưng nó được hợp nhất hoàn toàn trong nhánh ngược dòng của nó, thì Git tiến hành một cảnh báo có vẻ như:

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

Trong đó xxxxxxxxchỉ ra một id cam kết. Việc được hợp nhất hoàn toàn ở thượng nguồn cho thấy rằng các cam kết experimentđã được đẩy vào kho lưu trữ gốc, do đó ngay cả khi bạn mất chúng ở đây, ít nhất chúng có thể được lưu ở nơi khác.

Vì Git không kiểm tra các chi nhánh khác, nên có thể an toàn để xóa một chi nhánh vì bạn biết rằng nó được hợp nhất hoàn toàn vào một chi nhánh khác; bạn có thể thực hiện việc này với -Dtùy chọn như được chỉ định hoặc chuyển sang chi nhánh đó trước và để Git xác nhận trạng thái hợp nhất hoàn toàn cho bạn.


1
Chìa khóa là "hợp nhất hoàn toàn trong chi nhánh hiện tại ". Tôi đã có một nhánh X 'từ X được hợp nhất hoàn toàn vào X và đã xóa gốc / X'. Nhưng với Y đã kiểm tra tôi nhận được cảnh báo này. Khi tôi kiểm tra XI đã có thể xóa X '. Nó khá là ngu ngốc, tôi nghĩ vậy.
Lawrence Dol

2
Câu trả lời này là đạo văn từ đây mà không có sự quy kết chimera.labs.oreilly.com/books/1230000000561/
Mark

3

để xem những thay đổi không được hợp nhất, tôi đã làm điều này:

git checkout experiment
git merge --no-commit master

git diff --cached

Lưu ý: Điều này cho thấy những thay đổi trong masterđó không phải là trong experiment.

Đừng quên:

git merge --abort

Khi bạn đã hoàn thành việc tìm kiếm.


@IgorGanapolsky Dunno chính xác, mặc dù thông thường man git-resetvà các lệnh thiết lập lại git là đủ để phục hồi từ các vấn đề trạng thái.
ThorSummoner

3

Giải pháp dễ nhất với Giải thích (giải pháp kiểm tra hai lần) (đối mặt với vấn đề trước đó)

Vấn đề là:

1- Tôi không thể xóa chi nhánh

2- Thiết bị đầu cuối tiếp tục hiển thị một thông báo cảnh báo rằng có một số cam kết chưa được phê duyệt

3- biết rằng tôi đã kiểm tra chủ và chi nhánh và chúng giống hệt nhau (cập nhật)

giải pháp:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

Giải trình:

khi nhánh của bạn được kết nối với nhánh từ xa ngược dòng (trên Github, bitbucket hoặc bất cứ thứ gì), bạn cần hợp nhất (đẩy) nó vào master và bạn cần đẩy các thay đổi mới (cam kết) sang repo từ xa (Github, bitbucket hoặc bất cứ điều gì) từ chi nhánh,

Những gì tôi đã làm trong mã của mình là tôi đã chuyển sang chủ, sau đó hợp nhất chi nhánh vào nó (để đảm bảo chúng giống hệt nhau trên máy cục bộ của bạn), sau đó tôi lại chuyển sang chi nhánh và đẩy các bản cập nhật hoặc thay đổi vào điều khiển từ xa trực tuyến repo bằng cách sử dụng "git đẩy".

Sau đó, tôi lại chuyển sang chủ và cố gắng xóa chi nhánh và vấn đề (thông báo cảnh báo) biến mất và chi nhánh đã xóa thành công


3

Bạn có thể chỉ cần tìm ra:

git log - chủ nhân ... thử nghiệm

--cherry tùy chọn là một từ đồng nghĩa với --right-only --cherry-mark --no-merges

trang git-log man cho biết

Thật hữu ích để giới hạn đầu ra cho các cam kết ở phía chúng tôi và đánh dấu những kết quả đã được áp dụng cho phía bên kia của lịch sử rẽ nhánh với log git --cherry ngược dòng ... mybranch, tương tự như git cherry thượng nguồn mybranch.

FYI. --cherry-pickbỏ qua các cam kết tương đương nhưng --cherry-markskhông. Thật hữu ích khi tìm rebase và buộc các thay đổi được cập nhật giữa chi nhánh công cộng ngược dòng và hợp tác


1

Tôi không có chi nhánh thượng nguồn trên git địa phương của tôi. Tôi đã tạo một chi nhánh địa phương từ chủ, git checkout -b mybranch. Tôi đã tạo một nhánh với GUI bitbucket trên git ngược dòng và đẩy nhánh cục bộ của tôi (mybranch) đến nhánh ngược dòng đó. Khi tôi đã tải git trên git cục bộ của mình để lấy nhánh ngược dòng, tôi có thể thực hiện một nhánh git -d mybranch.


0

Tôi tin rằng lá cờ --forcelà những gì bạn đang thực sự tìm kiếm. Chỉ cần sử dụng git branch -d --force <branch_name>để xóa chi nhánh cưỡng bức.

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.