2015-03-11 21 views
7

Tôi đang ở trong một tình huống mà một số thay đổi được thực hiện trong một nhánh tính năng không được phản ánh trong chính, mặc dù nhánh này đã được hợp nhất vào nó. Tôi không hiểu tại sao. Để đơn giản, chúng ta hãy nói điều này cam kết đã một băm "A" và thay đổi tập tin "tập tin"Git "missing" commit

này có lẽ là tốt nhất được minh họa bằng các lệnh sau:

$ git checkout master 

$ git branch --contains A 
* master 
feature_branch 

$ git log file | grep A 
(no output) 

$ git checkout feature_branch 

$ git log file | grep A 
A 

bất cứ ai có thể giải thích những gì đang xảy ra ở đây? Quan trọng hơn, có điều gì có thể được thực hiện để ngăn chặn điều này trong tương lai không?

EDIT:

Như đã đề cập bởi một vài người, sau đây không thể hiện cam kết:

$ git checkout master 

$ git log --follow file | grep A 
A 

Nhưng vấn đề là ... tập tin đã không đổi tên. Vì vậy mà không giải thích đầy đủ mọi thứ, hoặc là ..

+1

Đầu ra nào, nếu có, bạn nhận được nếu bạn chạy 'git log A..master'? – Jubobs

+0

Bạn đã hợp nhất như thế nào? Hợp nhất có thể ghi lại các cam kết (ví dụ: bí). –

+0

Có đầu ra. Rất nhiều đầu ra. Cam kết đặc biệt này đã được thực hiện hơn một tháng trước .. nó chỉ gần đây đã mang đến sự chú ý của tôi rằng nó đã không được phản ánh trong chủ. –

Trả lời

0

Nếu bằng cách nào đó vị trí của tập tin đã thay đổi, bạn có thể cần phải nói git log-follow:

$ git checkout master 
$ git log --follow -- file | grep A 

Bạn có thể kiểm tra nếu có một sự khác biệt giữa git log --oneline -- filegit log --oneline --follow -- file, để xem tệp đã được di chuyển hay chưa.

+0

Tôi không tin rằng vị trí của tệp đã thay đổi. Nhưng tôi vẫn chạy lệnh, chỉ để xem điều gì sẽ xảy ra .. và đáng ngạc nhiên (đáng kinh ngạc) lo và nhìn, có cam kết còn thiếu .. –

+0

@Gauthier - nghĩ rằng có lỗi đánh máy: '--online' - -> '--oneline'? – KazR

4

Bạn là nạn nhân của sự hợp nhất tà ác.

Dưới đây là làm thế nào để tái tạo nó

git init testrepo 
cd testrepo 

touch initial 
git add initial 
git commit -m 'initial commit' 

git checkout -b feature_branch 
echo "A" >> file 
git add file 
git commit -m 'file committed' 

git checkout master 

Bây giờ làm một hợp nhất tương tác như nếu có xung đột nhập

git merge --no-commit --no-ff feature_branch 

và di chuyển các tập tin file (ác merge).

testrepo (master|MERGING) 

git mv file someOtherFile 
git commit 

Bây giờ bạn sẽ thấy rằng tổng chi nhánh chứa các cam kết (trong trường hợp của tôi 9469682) mà giới thiệu tập tin file

git branch --contains 9469682 
    feature_branch 
* master 

Nhưng một git log sẽ không hiển thị nó, bởi vì nó đã được chuyển

git log -- file 
(no output) 

Sử dụng

git log --follow -- file 

và cam kết xuất hiện lại.

Cũng nên nhớ rằng hợp nhất có thể trở nên xấu xa hơn. Nếu nội dung của file cũng thay đổi nhiều hơn èven git log --follow sẽ không phát hiện ra nó, vì ngưỡng đổi tên.

Trong trường hợp này, hãy sử dụng git log --follow --find-renames= để điều chỉnh ngưỡng đổi tên.

Nếu tạo khác biệt, phát hiện và báo cáo tên cho mỗi cam kết. Để theo dõi các tệp sau khi đổi tên trong khi duyệt qua lịch sử, hãy xem - theo dõi. Nếu n được chỉ định, đó là ngưỡng trên chỉ số tương tự (nghĩa là số lần thêm/xóa so với kích thước của tệp). Ví dụ: -M90% nghĩa là Git nên xem xét một cặp xóa/thêm để đổi tên nếu hơn 90% tệp không thay đổi. Không có dấu%, số sẽ được đọc dưới dạng phân số, với dấu thập phân trước dấu phẩy. Tức là, -M5 trở thành 0,5, và do đó giống như -M50%. Tương tự, -M05 tương tự như -M5%. Để hạn chế phát hiện để đổi tên chính xác, hãy sử dụng -M100%. Chỉ số tương tự mặc định là 50%.

+0

Vấn đề là, các tệp này không được đổi tên. Tôi vừa mới nhận thức được * khác * cam kết từ một nhánh tính năng khác trưng bày cùng một vấn đề. –