2015-03-05 13 views
8

Khi tôi chạy git status, đây là những gì tôi đang nhìn thấy:"Bạn đang ở giữa một buổi sáng" nghĩa là gì?

$ git status 
On branch master 
Your branch is ahead of 'origin/master' by 1 commit. 
    (use "git push" to publish your local commits) 

You are in the middle of an am session. 
    (fix conflicts and then run "git am --continue") 
    (use "git am --skip" to skip this patch) 
    (use "git am --abort" to restore the original branch) 

Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: xxx 
    modified: xxx 
    modified: xxx 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

    xxx 

no changes added to commit (use "git add" and/or "git commit -a") 

$ git version 
git version 1.9.1 

Vì vậy, những gì' git rằng đang cố gắng cho tôi biết và những gì cách chính xác để giải quyết nó?

Tôi không biết liệu điều đó có liên quan hay không, nhưng chúng tôi sử dụng và tất cả các thay đổi đều trải qua quy trình xem xét/phê duyệt.

+1

Điều này có thể có liên quan: https://www.kernel.org/pub/software/scm/git/docs/git-am.html – nwinkler

+1

'git am --continue' không thành công do xung đột trong nhánh chưa được giải quyết requi màu đỏ để tiếp tục áp dụng bản vá hiện tại, 'git am --skip' không thành công vì nó bỏ qua bản vá hiện tại và cố gắng tiếp tục từ hộp thư, nhưng không có thư mới nào được áp dụng để phiên có thể tiếp tục. – AlexKey

Trả lời

5

khắc phục xung đột

Thực hiện git diff để xem nếu bạn có bất cứ dấu hiệu hợp nhất, như:

$ git diff hello.txt 
diff --cc hello.txt 
index 5eb9649,379bd44..0000000 
--- a/hello.txt 
+++ b/hello.txt 
@@@ -1,1 -1,1 +1,7 @@@ 
++<<<<<<< HEAD 
+Hello, master change. 
++||||||| merged common ancestors 
++Hello, Original. 
++======= 
+ Hello, branch b1 change. 
++>>>>>>> b1 

Nếu không, hãy thử và đăng git am với -3 tùy chọn: git am -3

Nếu bạn có, ví dụ như sử dụng kdiff3 (Windows hoặc Linux), git mergetool --tool=kdiff3. Điều đó sẽ khởi động một công cụ đồ họa cho phép bạn lựa chọn giữa local, base and remote

+--------------------------------+ 
| BASE | LOCAL  | REMOTE | 
+--------------------------------+ 
|    MERGED    | 
+--------------------------------+ 

http://tedfelix.com/software/git-mergetool-kdiff3.png

Với:

  • LOCAL: Một tập tin tạm thời chứa các nội dung của tập tin trên các chi nhánh hiện hành.
  • BASE: Tệp tạm thời chứa cơ sở chung để hợp nhất.
  • REMOTE: Tệp tạm thời chứa nội dung của tệp cần hợp nhất.
  • MERGED: Tệp có chứa các điểm đánh dấu xung đột.

Chỉ nên thực hiện git am --continue khi trạng thái git không báo cáo bất kỳ tệp không được ghi nào.

Xem thêm với Git Conflict Resolution bởi Ted Felix: nó có tóm tắt tiện dụng này:

  1. Luôn luôn sử dụng "-3" với "git am" để đảm bảo bạn nhận được dấu hiệu xung đột.
  2. Sử dụng "git status" và "git diff" để tìm hiểu điều gì đã xảy ra.
  3. Giải quyết xung đột theo bất kỳ phương pháp nào sau đây:
    • Chỉnh sửa từng tệp xung đột với trình chỉnh sửa yêu thích của bạn.
    • "git checkout --theirs" hoặc "git checkout --ours".
    • "git checkout -m" để hoàn tác giải quyết xung đột trên các tệp cụ thể. (BE CAREFUL!)
    • "git mergetool" và công cụ GUI hợp nhất thích hợp như kdiff3.
  4. "các tệp đã giải quyết.
  5. "git am --continue" để tiếp tục sáng.

Với Git 2.17 (Q2 2018), đừng quên để bắt đầu phiên sáng git của bạn với git am --show-current-patch để có được một cái nhìn tốt hơn về con đường để chỉnh sửa trong trường hợp xung đột.
Xem "Show current git interactive rebase operation".

1

Điều gì đã xảy ra là một số tệp trong cây đang thay đổi và đã bắt đầu phiên AM trước đó (AM là cách áp dụng các bản vá từ thư email nơi email được chia thành thay đổi và thông tin tác giả và sau đó được áp dụng dưới dạng bản vá cho kho lưu trữ).

Điều này cũng giống như khi bạn thay đổi tệp, cam kết, rồi cố gắng hợp nhất thay đổi trong cùng một tệp trong cùng một dòng dựa trên phiên bản cũ. Git chỉ đơn giản là không biết phiên bản thay đổi nào là hợp lệ và do đó kết thúc ở trạng thái .

Những dòng này cho bạn biết rằng bạn có mâu thuẫn:

You are in the middle of an am session. 
    (fix conflicts and then run "git am --continue") 
    (use "git am --skip" to skip this patch) 
    (use "git am --abort" to restore the original branch) 

Có một số cách để giải quyết loại này mâu thuẫn, và tất cả chúng đều bằng tay. Bạn cần một số công cụ hợp nhất 3-chiều (có thể google cho nó) cho phép bạn so sánh các thay đổi và chọn một trong những bạn muốn giữ. vim trình soạn thảo AFAIK có công cụ này được nhúng, nhưng tôi chưa bao giờ sử dụng nó.

Ngoài ra còn có các công cụ đồ họa cho phép bạn giải quyết xung đột trong phần mềm như SourceTree hoặc tương tự, nhưng tất cả phụ thuộc vào vị trí lưu trữ và liệu các công cụ đồ họa có sẵn ở đó hay không.

UPD: Bạn cũng có thể hoàn nguyên thay đổi phiên AM này bằng cách thực hiện git am --abort được viết trong thư. Điều này sẽ hoàn nguyên chi nhánh về trạng thái trước khi phiên AM bắt đầu, mất thông tin bản vá một cách hiệu quả.

+0

_AM là một cách để áp dụng các bản vá lỗi từ các email mà email được chia thành các thay đổi và thông tin tác giả và sau đó được áp dụng như một bản vá cho repository_ --- Trang người được liên kết trong OP đọc cùng một mô tả, nhưng thông điệp * * đó là gì? Tôi chưa bao giờ liên quan đến từ xa với email (ngoại trừ thiết lập cấu hình 'user.email'). – ozbek

+0

@ozbek Điều này có thể liên quan đến cách hoạt động/cấu hình của gerrit. Nếu kho lưu trữ nằm trên một số máy chủ Linux và được quản lý bởi một số người dùng (thường là người dùng 'git'), thì có thể gửi email cho người dùng này hoặc tạo email cục bộ. Một số dịch vụ chủ động dựa vào chức năng Linux mặc định này khi sử dụng email. Giả sử của tôi là Gerrit đã được cấu hình để sử dụng email để chấp nhận các bản vá lỗi và do đó có thể gửi email tới git @ localhost với một bản vá. Tôi khuyên bạn nên kiểm tra tài liệu Gerrit và cấu hình của bạn để tìm ra điều này. – AlexKey

1

Hãy nhìn vào ý nghĩa của chúng từng người một ...

On chủ chi nhánh chi nhánh của bạn chạy nhanh của 'nguồn gốc/master' 1 cam kết. (sử dụng "git push" để xuất bản các cam kết địa phương của bạn)

Điều này có nghĩa là bạn đã cam kết nội dung nào đó nhưng chưa đồng bộ hóa với nguồn gốc.

Địa phương: Kho lưu trữ được nhân bản trong máy của bạn và bắt đầu làm việc trên đó.

nguồn gốc: Kho chính từ nơi mọi người có thể sao chép.

Bạn đang ở giữa phiên sáng.(Khắc phục xung đột và sau đó chạy "git am --continue") (sử dụng "git am --skip" để bỏ qua bản vá này) (sử dụng "git am --abort" để khôi phục lại các chi nhánh gốc)

Bạn đang trong quá trình tạo bản vá và bạn có xung đột, bạn phải khôi phục mọi thứ về trạng thái ban đầu (sử dụng git am --abort) hoặc giải quyết xung đột bằng cách làm theo các bước sau.

  1. Loại git status
  2. Kiểm tra tình trạng, nếu bạn thấy tên tập tin nói (both modified)

  3. mở các tập tin, giải quyết các xung đột giữ những gì bạn muốn và loại bỏ những gì bạn không.

  4. Bây giờ thêm các tập tin bạn giải quyết những mâu thuẫn trong bằng cách gõ git add file1 file2

  5. Bây giờ thời gian của mình để tiếp tục phiên

  6. Loại git am --continue

Trong trường hợp bạn muốn bỏ qua làm bản vá này loại

git am --skip 

Bạn đã có một số thay đổi và bạn đang thực hiện một bản vá trong số . Những thay đổi không dàn dựng cho cam kết: (sử dụng "git add ..." để cập nhật những gì sẽ được cam kết) (sử dụng "git checkout - ..." để thay đổi loại bỏ trong thư mục làm việc)

modified: xxx 
modified: xxx 
modified: xxx 

không được theo dõi file: (sử dụng "git add ..." để đưa vào những gì sẽ là cam kết)

xxx 

không có thay đổi bổ sung để thực hiện (sử dụng "git add" và/hoặc "git commit -a")

Vì vậy, tại đây git đang cố gắng thông báo cho bạn về các tệp được thay đổi kể từ lần commit cuối cùng. Những người đã được các tập tin cũ và bạn chỉ cần thay đổi somethings ở đây và ở đó bên trong nó sẽ được hiển thị như là sửa đổi.

Hình bạn thấy trong các tệp không được theo dõi là những tệp không được biết trước đó vì chúng là các tệp mới.

bước để giải quyết bước này

1.) Đối với các tập tin untracked

1.1.) git add <filename1> <filename2> and so on... 

2.) Cam kết các tập tin bổ sung vào kho

2.1) git commit -m "Message of your choice" 

Note

Như bạn đã đề cập bạn đang làm việc với một hệ thống xem xét cũng như (Gerrit). Bạn có thể muốn chỉ cần thêm một bản vá mới vào một lời hứa hiện có chứ không phải là một cam kết mới. Nếu đó là trường hợp bạn cần phải làm điều này

git commit --amend 

3.) Bây giờ thời gian của mình để đẩy mã (nếu bạn muốn)

git push 

Đối với Gerrit làm điều này

git push review 
Các vấn đề liên quan