git - hợp nhất xung đột khi cục bộ bị xóa nhưng tệp tồn tại trong điều khiển từ xa


116

Tôi là người mới sử dụng git và tự hỏi tôi nên thực hiện hợp nhất như thế nào khi trong repo cục bộ, tôi đã xóa một số tệp trên nhánh chính nhưng những tệp này vẫn tồn tại trong nhánh chính từ xa.

Sau khi thực hiện git-merge, nó hiển thị các xung đột đã xảy ra.

Sử dụng git gui, nó cho thấy rằng tệp cục bộ bị xóa, trong khi tệp nhánh từ xa có nội dung.

Làm cách nào để ngăn các tệp này bị xung đột? Có cách nào đơn giản để sử dụng git gui không?

Cảm ơn nhiều


Trước đây, một điều tôi đã làm là để các tệp "đã xóa" trong quyền kiểm soát nguồn, nhưng loại trừ chúng khỏi dự án / makefile / bất cứ điều gì. Đó là một cách giải quyết tạm thời ổn cho các xung đột hợp nhất, ít nhất.
Mark Rushakoff

2
Bạn khắc phục nó giống như cách bạn sửa bất kỳ xung đột hợp nhất nào: thêm phiên bản mong muốn (hoặc tệp hoặc thiếu tệp) vào chỉ mục, rồi cam kết. Bạn muốn cái nào?
Cascabel


@MarkRushakoff Tôi sẽ nói lại lời khuyên của bạn là "khi tôi rơi vào tình huống cần giải quyết xung đột, tôi chỉ đơn giản là không giải quyết những điều đó cho thật mà chỉ che giấu chúng để chúng cắn ai đó (có thể không phải tôi) trong tương lai". Đây thực sự là lời khuyên tốt cho những người muốn đưa nhiều vấn đề vào dự án.
Victor Yarema

Câu trả lời:


155

Bạn nên giải quyết các xung đột khi bạn thấy phù hợp. Nếu tệp thực sự phải bị xóa và bạn sẽ xuất bản thay đổi đó thành nguồn gốc, hãy xóa lại:

git rm path/to/file

Nếu thực tế tệp vẫn được theo dõi, hãy thêm tệp (phiên bản trong cây công việc sẽ là phiên bản từ nguồn gốc):

git add path/to/file

Sau khi thực hiện một trong hai cách đó để giải quyết xung đột, hãy cam kết hợp nhất.


Tôi có một số tệp, tất cả đều nằm trong cùng một thư mục và tất cả đều có cùng một hậu tố. Có lối tắt nào để xóa tất cả chúng cùng một lúc trong khi vẫn giữ nguyên các tệp còn lại trong dir không?
chiborg

@chiborg: Đó chỉ là một câu hỏi vỏ. cdvào thư mục, và git rm *.ext. Vỏ của bạn (không phải Git) mở rộng *.extthành tất cả các tên tệp phù hợp.
Cascabel

Và nếu tôi muốn giữ lại một số tệp? git rmkhông có -icờ.
chiborg

@chiborg: Bạn nói rằng bạn muốn xóa mọi thứ có hậu tố đã cho và giữ nguyên mọi thứ khác. Đó chính xác là những gì tôi đã nói với bạn cách làm. Hay ý bạn là git rm *-suffix.ext? Cùng một sự khác biệt. Nếu bạn đang gặp sự cố khi tìm cách sử dụng ký tự đại diện shell, hãy hỏi trên unix.stackexchange.com. Nếu bạn biết thực tế rằng những gì bạn muốn không thể thực hiện được với thao tác lấp lánh, hãy sử dụng rm -ivà làm theo git add -uđể xóa các thao tác xóa.
Cascabel

2
@Jefromi, nếu tôi đang chỉ định -s recursive -X ours, tại sao nó vẫn cần thiết git rmgit add?
Noel Yap

27

Là một mẹo được bổ sung ngoài câu trả lời được chấp nhận, trong "đã bị xóa bởi chúng tôi" , nếu bạn muốn xem những thay đổi đã được thực hiện đối với tệp đã xóa để bạn có thể áp dụng những thay đổi đó ở những nơi khác mà bạn có thể sử dụng:

git diff ...origin/master -- path/to/file

Nếu đó là tình huống "bị họ xóa" và bạn muốn xem các thay đổi để có thể áp dụng chúng ở nơi khác, bạn có thể sử dụng:

git diff origin/master... -- path/to/file

6
Đúng! Điều này rất quan trọng nếu bạn không muốn loại bỏ những thay đổi mà bạn đang hợp nhất, chẳng hạn như khi tôi một tệp vừa được đổi tên hoặc nội dung của nó đã được di chuyển trước khi tệp bị xóa.
Edward Anderson

8
Xin nhắc lại: Đây không hoạt động khi cuộc xung đột xảy ra trong rebasing . Cần phải rõ ràng nhưgit diff mybranch@{1}...origin/master -- path/to/file
nschum

@nschum Cảm ơn! Đây chính xác là những gì tôi đang tìm kiếm.
Chuim

2
Bạn cũng có thể sử dụng git diff --base(xem câu trả lời khác của tôi).
Dorian Marchal

Xin chào Joseph, tôi vẫn bị mắc kẹt mặc dù câu trả lời này có vẻ đầy hứa hẹn. Nếu bạn có thời gian, tôi rất mong bạn trả lời ở đây: stackoverflow.com/q/63044843/470749 Cảm ơn!
Ryan

9

Trong Git GUI, bạn chọn tệp bị xung đột rồi nhấp chuột phải vào vùng văn bản chính nơi hiển thị văn bản xung đột.

Trong menu ngữ cảnh xuất hiện, bạn có thể chọn sử dụng "Từ xa" hoặc chọn "Địa phương". Vì vậy, nếu một tệp bị xóa từ xa, bạn có thể chọn "Từ xa" để thực hiện xóa cục bộ và ngược lại.

Tôi đã mất một tháng để tìm ra nó ... sẽ rất tuyệt nếu Git GUI thực sự có tài liệu ...


4

Câu trả lời được đánh giá cao nhất tập trung vào cách giải quyết xung đột.

Trước đó, bạn có thể muốn biết điều gì đã thay đổi từ xa trong các tệp bị xóa cục bộ.

Để làm điều đó, bạn có thể xem các thay đổi với:

git diff --base

Từ https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

So sánh cây làm việc với phiên bản "cơ sở" [...]. Chỉ mục chứa các giai đoạn này chỉ cho các mục không hợp nhất tức là trong khi giải quyết xung đột.


Đây là lời giải thích hay về git diff --base stackoverflow.com/a/60484874/470749
Ryan

0

Trong EGit, tôi cũng tìm thấy các vấn đề. Giải pháp của tôi là:

  • Đã sử dụng chế độ xem Git Staging.
  • Nhấp đúp vào từng tệp được hiển thị trên các thay đổi không theo giai đoạn để mở trình so sánh
  • Nhấp vào biểu tượng "Sao chép tất cả từ trái sang phải"
  • Lưu tệp (nó sẽ biến mất khỏi danh sách không được đánh dấu)

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.