2015-06-01 24 views
6

Tôi là một lập trình viên mới trong một nhóm. Và vào ngày đầu tiên của tôi, tôi có tệp được đổi tên này bên trong một giai đoạn, sẵn sàng được cam kết bởi git:Đổi tên các tập tin bên trong git

$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     modified: .gitignore 
     new file: reports/SQLS.rar 
     renamed: account/enter_rules.php -> enter_rules.old.php 

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

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

     account/enter_rules.php 

Cho 2 dòng đầu tiên tôi không gặp vấn đề gì. Tôi biết chuyện gì đang xảy ra. Nhưng đối với người cuối cùng được đổi tên:, tôi không chắc nên làm gì. Hệ thống hoạt động tốt.

Bên trong thư mục công việc tôi có:

account/enter_rules.php 

tôi không thể tìm thấy file enter_rules.old.php.

Có vẻ như lập trình viên khác đã tạo bản sao từ tệp, được đặt tên thực tế là .old, đã thực hiện một số kiểm tra và mã mới, hơn là tổ chức các thay đổi và quên cam kết. Hơn anh ta đã xóa cũ.php

Cách tiếp cận tốt nhất để giải quyết tình huống này là gì? Tôi muốn đặt tình trạng git rõ ràng trước khi bắt đầu làm việc trên nó và thực hiện thay đổi của riêng tôi.

Tôi đã tìm thấy bài đăng này nhưng tôi không chắc liệu mình có nên hoặc có thể cam kết trong hoàn cảnh của mình hay không. Handling file renames in git


Sau khi đọc tất cả các đề nghị, đã giúp tôi rất nhiều, đây là những gì tôi đã làm:

  1. Tôi chỉ cần thực hiện một bản sao (chỉ dành cho an toàn) từ tập tin enter_rules.php
  2. tôi " đã nói "to git (với INDEX) rằng tên tệp đã bị thay đổi. $git commit -m "committing name changes". Tại thời điểm này git không biết rằng .old đã bị xóa.
  3. Sau đó, tôi đã nhập $git rm "account/enter_rules.old.php" để giải quyết dòng: Thay đổi không được tổ chức cho cam kết:. Trong cùng một cách, chúng tôi sử dụng $git add . để "thông báo" git theo dõi <file>, chúng tôi nên sử dụng $git rm <file> để "báo" git để quên điều này <file>.
  4. Sau đó, tôi đã nhập $git status và tôi nhận được thông báo XANH: đã bị xóa: account/enter_rules.old.php. Vì vậy, tôi nên nói với chỉ mục, tệp .old đã bị xóa. Tôi gõ $git commit -m "committing delete changes"
  5. Bây giờ git biết rằng enter_rules.php được đổi tên thành enter_rules.old.php và sau đó enter_rules.old.php đã được gỡ bỏ (xóa).
  6. Sau đó, tôi đã giải quyết dòng cuối cùng (Tệp không được theo dõi :). Tôi chỉ nói với git rằng một tập tin mới được tạo ra và nó gọi enter_rules.php. Tôi đã thêm và cam kết như nó phải.

Tất cả các đề xuất đã giúp tôi giải quyết vấn đề, vì vậy tôi sẽ cố gắng công bằng và sẽ kiểm tra xem ai có điểm kém hơn.

+0

Điều này rất lạ. Dựa trên những gì bạn đang nói và những gì 'git status' cho thấy, nó có vẻ như đồng nghiệp của bạn chạy' git mv enter_rules.php enter_rules.old.php' và sau đó sao chép tập tin đó trở lại enter_rules.php? Tại sao anh lại làm vậy? – DIMMSum

+0

Chỉ cần rõ ràng. Bạn * không * cần 'enter_rules.old.php' nhưng bạn cần' account/enter_rules.php', đúng không? – DIMMSum

+0

Xin chào Decave, tôi đã thay đổi thông tin. Tôi nên dán tất cả đầu ra git. Có vẻ như anh ta đã tạo một bản sao từ tệp và đặt tên là .old.php. Hơn ông đã thực hiện một số thay đổi trong mã. Có thể nó đã hoạt động. Hơn ông đã xóa các tập tin .old và thêm vào giai đoạn. Tôi không biết chính xác chuyện gì đã xảy ra. Nhưng bây giờ tôi có tình huống này mà bạn thấy trong git đầu ra. – zwitterion

Trả lời

1

Có vẻ như rõ ràng với tôi những gì đã xảy ra ở đây:

Trong tình trạng ban đầu đã có hai tập tin account/enter_rules.phpaccount/enter_rules.old.php.

đồng nghiệp của bạn phải đã làm một cái gì đó như thế này:

git rm account/enter_rules.old.php 
git mv account/enter_rules.php account/enter_rule.old.php 

sau đó thay đổi nội dung mới account/enter_rules.php và để lại nó unstaged.

Nếu bạn đồng ý với những thay đổi chỉ

git add account/enter_rules.php 
git commit 

khác

rm account/enter_rules.php 
git reset HEAD 

hủy bước thay đổi của mình.

Điều gì lạ với tôi là tại sao bạn làm việc trên bản sao của đồng nghiệp của kho lưu trữ với những thay đổi không được cam kết?

+0

Như tôi đã nói. Tôi mới đến trong đội. Vì vậy, tôi đang thay thế một lập trình viên khác. Tôi đã mong đợi để nhận được tất cả mọi thứ ok. Chỉ cần rõ ràng để bắt đầu viết mã. – zwitterion

+0

Có vẻ như anh ấy đã bỏ công việc mà không hoàn thành công việc (nghĩa là cam kết tất cả thay đổi) – zwitterion

1

Mặc dù git nói rằng enter_rules.old.php được đổi tên, nó cũng nói rằng nó đã bị xóa dưới đây:

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

này có nghĩa là các tập tin đã biến mất, và để cho git để áp dụng xóa đó đến kho lưu trữ, các hành động xóa nó phải được bao gồm trong cam kết của bạn. Vì thay đổi được theo dõi, nhưng không được tổ chức, bạn có thể thực hiện điều này bằng một lệnh đơn giản (được mô tả bên dưới trong phần 3).

  1. Thêm tệp vào account/enter_rules.php sử dụng git add account/enter_rules.php.
  2. Nếu bạn chạy lại git status, enter_rules.old.php phải được đánh dấu để xóa và account/enter_rules.php phải được dàn dựng để được cam kết.
  3. Chạy git commit --all để thực hiện tất cả thay đổi theo giai đoạn của bạn.

Bằng cách chạy git commit --all, điều này cũng sẽ loại bỏ việc đồng nghiệp của bạn thực hiện nhưng không tự cam kết.

Có vẻ như đồng nghiệp của bạn đã sử dụng git mv để đổi tên tệp và sau đó xóa nó nhưng không xóa giai đoạn.

1

Git không hoạt động trên các tệp trong thư mục làm việc của bạn. Thay vào đó, nếu làm việc trên một cái gì đó gọi là "chỉ mục". Điều đó có nghĩa là bạn có thể thay đổi tệp, đặt chúng vào chỉ mục ("sớm, tôi muốn ...") và làm cho chỉ mục này vĩnh viễn với git commit.

Lợi thế chính ở đây là bạn có thể thu thập nhiều thay đổi trong chỉ mục bằng các lệnh riêng lẻ (như khi bạn đã thực hiện một số thay đổi và muốn đặt chúng vào từng cam kết riêng lẻ). Quá trình này được gọi là "dàn dựng". Ví dụ: git add hoạt động trên chỉ mục.

gì đã xảy ra trong trường hợp của bạn là:

  1. Bạn đã đổi tên tập tin (có thể là trong IDE của bạn) và nói với Git để "sân khấu" sự thay đổi. Git nhớ điều này trong chỉ mục.
  2. Bạn đã xóa tệp mà không nói cho Git
  3. Bạn nhận được bản sao account/enter_rules.php từ đâu đó và sao chép vào thư mục làm việc của bạn, mà không cần nói với Git.

Đối với Git, tình huống hiện giờ biết rằng có một tệp là enter_rules.old.php mà bạn muốn cam kết. Bạn có thể làm điều đó bởi vì Git nhớ đủ để thực sự làm điều đó.

Đồng thời, không gian làm việc của bạn đã thay đổi rất nhiều. Tệp đã dàn dựng đã biến mất và một bản sao mới đã xuất hiện. Vì Git không thể đọc được suy nghĩ của bạn, nên nó không cố gắng tìm hiểu ý nghĩa của nó. Nó chỉ liệt kê các sự kiện.

Bây giờ để dọn dẹp:

Để làm Git quên về đổi tên để enter_rules.old.php, sử dụng git reset HEAD enter_rules.old.php

Nó bây giờ nên nhớ rằng account/enter_rules.php được theo dõi. Nếu bạn thay đổi tệp này, nó sẽ hiển thị nó như đã thay đổi. Chạy git status để đảm bảo.

+1

các bước có khả năng nhất là '2' và' 3' nơi thực sự chỉ đổi tên tệp trở lại, nhưng không nói git về nó ... –

+1

@ umläute Ah vâng, điều đó có nghĩa là –

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