2013-04-26 32 views
9

Tôi hơi bối rối bởi điều này ...Tại sao tôi có cùng cam kết trong hai nhánh với các băm khác nhau

Tôi có hai chi nhánh có cùng một loạt cam kết trong cả hai.

Lịch sử thực sự là chúng được tác giả của đồng nghiệp của tôi, cam kết và đẩy vào github trên nhánh A. Ở giai đoạn nào đó tôi đã sáp nhập nhánh A với chi nhánh B của tôi. Những gì git bây giờ xuất hiện để hiển thị là cam kết của mình trong chi nhánh A, với băm của họ, và các cam kết tương tự trong nhánh (phân nhánh) của tôi, cho tôi thấy là tác giả, và một bộ băm khác, xen kẽ với công việc tôi làm trên nhánh của tôi.

Điều này giống như một số vấn đề phát lại, (cả hai chúng tôi đều sử dụng GitHubForWindows một số thời gian thực hiện việc đồng bộ hóa) nhưng tôi không biết vấn đề nào đang được báo cáo cho chúng tôi.

Bất kỳ ý tưởng nào về nguyên nhân gây ra điều này hoặc cách thực hiện trực tiếp sẽ được đánh giá cao.

+2

Đã sử dụng 'cherry-pick'? – GoZoner

+0

AT một thời gian trong quá khứ, có, nhưng không phải trong bit này của lịch sử. – Andiih

Trả lời

4

Bạn sẽ nhận được một số công cụ quyền lực (đồng bằng gitk nên làm tốt) và chặt chẽ kiểm tra việc phù hợp (nhưng khác nhau ở băm) cam kết — nhìn những khác biệt trong các lĩnh vực Author, CommitterDate. Ngoài ra so sánh các băm của phụ huynh cam kết vì một đối tượng cam kết cũng ghi lại các băm của các commit cha của chúng và vì vậy nếu không các commit tương tự đề cập đến các tên cam kết SHA-1 cha khác sẽ khác nhau.

Ngoài ra, bạn có thể giải thích cách chính xác các cam kết của bạn được "xen kẽ" với các cam kết của bạn bè của bạn không? Tất cả những cam kết đó có tạo thành một lịch sử tuyến tính hoặc có các điểm hợp nhất không?

Trước đây sẽ cho biết rằng việc rebasing đã được sử dụng.

Với những thông tin có sẵn cho đến nay tôi sẽ làm điều này:

  1. Dừng sử dụng "Github cho Windows" cho không có trí tuệ giải pháp có xu hướng tạo ra những tình huống bạn đang phải đối mặt ngay bây giờ: khi một cái gì đó phá vỡ bạn không có ý tưởng tại sao nó đã phá vỡ và làm thế nào để không phá vỡ.
  2. Nhận "thường xuyên" Git for Windows (và có thể là Git Extensions nếu bạn muốn giao diện người dùng ưa thích không cố gắng outsmart người dùng).
  3. Lưu nhánh chi tiết hiện tại của bạn bằng cách bỏ qua một nhánh khác.
  4. (Cứng) đặt lại chi nhánh đối tượng địa lý của bạn cho chi nhánh của bạn.
  5. Cherry-pick thay đổi của bạn từ cũ nhất đến mới nhất từ ​​chi nhánh bạn đã lưu.

    Điều này có thể tạo ra xung đột (vì các cam kết này sẽ được trồng vào một trạng thái mã khác mà ban đầu chúng được tạo).

Kết quả là bạn sẽ có chi nhánh không có cam kết "giả mạo".Sau đó cả bạn và bạn bè của bạn nên đọc về việc hợp nhất và rebasing quy trình công việc, áp dụng một trong số họ và sau đó, khi làm việc trên các chi nhánh tính năng, hãy hợp nhất và/hoặc rebasing một cách hợp lý, hiểu tại sao bạn làm điều này và điều gì xảy ra như vậy. Tôi sẽ khuyên bạn không nên mù quáng dựa vào một công cụ để làm Điều Đúng ™.

+0

Tôi hầu như không sử dụng Github cho các cửa sổ - tất cả các nhánh, sáp nhập và kéo và hầu hết các cam kết tôi thực hiện thông qua shell poshgit. Chủ yếu là tôi sử dụng nó để thiết lập xác thực ở vị trí số 1, để mở vỏ trong thư mục bên phải và xem lịch sử cơ bản. Tuy nhiên, những người khác trong dự án có sự phụ thuộc nhiều vào nó. Chúng tôi đã chọn anh đào và thiết lập lại cứng. Đã sắp xếp. Cám ơn. – Andiih

4

Nếu git rebase là một phần của quy trình làm việc của bạn, thì những gì bạn mô tả là phổ biến. Ví dụ:

$ git log --graph --oneline --all 
* 76af430 fc   # branch: foo 
| * 7c495ad mb   # branch: bar, master 
|/ 
* 74cbb35 a 

$ git rebase foo  # while on branch master 
First, rewinding head to replay your work on top of it... 
Applying: mb 

$ git log --graph --oneline --all 
* 6810e67 mb   # branch: master 
* 76af430 fc   # branch: foo 
| * 7c495ad mb   # branch: bar 
|/ 
* 74cbb35 a 
+0

Cảm ơn, đây là những gì gây ra với chúng tôi kịch bản được mô tả ở trên. Vì vậy, nếu bạn rebase chi nhánh X thành chi nhánh Y, và nó có cam kết từ một nhánh khác (không phải X và Y nhưng một nhánh khác, X), nó sẽ tạo ra các hash khác nhau (từ những cái trên X). Lý do tại sao điều này xảy ra? Có cách nào để ngăn chặn điều này (có nghĩa là - xác định rằng đây không phải là cam kết 'bản địa') trong một móc trước khi rebase? – Kemeia

2

Tôi gặp vấn đề "git diff diff" này sau khi rebasing hai nhánh nằm trong chuỗi. Cùng một cam kết đã được áp dụng cho cùng một điểm ngã ba vì vậy tôi đã bối rối khi thấy các chi nhánh phân kỳ. Ngay cả bản vá-id cũng giống nhau.

Nhìn vào diff liệu tiết lộ đó là "thời gian committer" đó là sự khác biệt:

$ diff <(git show --format=raw $COMMIT1) \ 
     <(git show --format=raw $COMMIT2) 
1c1 
< commit $COMMIT1 
--- 
> commit $COMMIT2 
5c5 
< committer $ME <[email protected]> 1470128045 +0200 
--- 
> committer $ME <[email protected]> 1470129095 +0200 

làm lại rebase với --committer-date-is-author-date trên rebase git cố định một số sự chênh lệch, nhưng không phải tất cả. (Tôi không chắc chắn lý do tại sao .. Tôi nghĩ rằng sự phân kỳ xảy ra tại rerere hợp nhất đầu tiên?)

sau đó tôi sử dụng filter-branch như một cái búa tạ:

git filter-branch --env-filter \ 
'export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE'\ 
origin/master..HEAD 

Đây là đủ để giữ cho series trong một dòng:

$ git show --format=raw HEAD | egrep 'author|committer' 
author $ME <[email protected]> 1470065063 +0200 
committer $ME <[email protected]> 1470065063 +0200 
+1

Lệnh tốt hơn để so sánh các cam kết gần giống hệt nhau: 'gitshow =" git show --color --format = fuller "; diff -u <($ gitshow $ commit1) <($ gitshow $ commit2) | less -R' Bằng lệnh này, chúng ta có CommitDate có thể đọc được (có thể khác nhau) và màu khác. – ruvim

Các vấn đề liên quan