2013-06-28 16 views
14

Tôi đã thực hiện một loại tái cấu trúc lớn trong dự án của mình: Tôi đã đổi tên tệp, xóa, thêm ... Bên cạnh đó, tôi đã thêm một số thư mục vào .gitignore. Tuy nhiên, tôi đã thực hiện một cam kết với một kho lưu trữ từ xa trước khi tái cấu trúc.Cách để "reinit" kho

Có cách nào để tạo git "reinit" cho kho lưu trữ của tôi không? Nếu không, tôi nên làm gì?

Cập nhật:

Tôi đã xóa các thư mục .git và bây giờ tôi có một lỗi của

gợi ý: Cập nhật đã bị từ chối vì là đỉnh của chi nhánh hiện tại của bạn là đằng sau gợi ý: từ xa của nó đối tác. Hợp nhất các thay đổi từ xa (ví dụ: 'git pull') gợi ý: trước khi đẩy lại. gợi ý: Xem 'Lưu ý về chuyển tiếp nhanh' trong 'git push --help' để biết chi tiết.

Tôi không muốn hợp nhất các thay đổi cục bộ với repo từ xa, tôi chỉ muốn đẩy ở đó, có nghĩa là thay thế hoàn toàn kho từ xa bằng cục bộ.

+0

Bạn có muốn có một lịch sử sạch bằng cách "reinit"? Tại sao bạn không đơn giản di chuyển về phía trước và cam kết những thay đổi mới? – Mingyu

+0

@Mingyu, tôi đã thực hiện chỉ một cam kết, do đó, có một kho lưu trữ sạch sẽ là một ý tưởng tốt. –

+0

Bản chất của repo từ xa là gì? Nếu nó không có bất kỳ hoạt động nhái, chỉ cần thay thế nó. – tripleee

Trả lời

5

CẬP NHẬT

Nếu bạn đã xóa các .git thư mục (không phải là một ý tưởng tuyệt vời), bạn có thể tạo một bản sao mới của repo và di chuyển công cụ của bạn vào đó, và tiếp tục ở đó. Một cái gì đó như thế này

cd .. 
git clone <remote-repo-url> new-repo 
rm -rf new-repo/*       // this will not remove new-repo/.git 
cp -f <original-local-repo> new-repo 
cd new-repo 

Sau đó tiếp tục như sau.

Lưu ý rằng tốt hơn là bạn có thể khôi phục thư mục .git. Tạo một repo mới sẽ mất tất cả thông tin repo địa phương bạn có trong repo địa phương gốc, giống như các chi nhánh địa phương không bao giờ bị đẩy.

END CẬP NHẬT

Bạn có thể

git reset --soft HEAD^ 
git add -A . 
git commit -m "rewriting history" 
git push --force origin master 

này sẽ sao lưu vào trước cam kết (trong khi vẫn giữ cây lao động và chỉ số), cam kết thay đổi của bạn, và sau đó buộc đẩy mà viết lại lịch sử đến điều khiển từ xa.

push --force là nội dung nguy hiểm. Nó sẽ làm phiền những người khác đã kéo, và được coi là rất thô lỗ, nhưng nếu không ai khác bắt đầu làm việc trên nó, đó không phải là một vấn đề.

Đây là những gì đang xảy ra:

--- A -- B master 

    ^
    |  
    origin/master 

git push 

--- A -- B master, origin/master 

git reset HEAD^ 
git commit -am "rewriting" 

--- A -- B origin/master 
    \ 
     \ 
     B' master 

git push --force 

--- A -- B 
    \ 
     \ 
     B' master, origin/master 
+0

Điều đó có hiệu quả không? Tôi nghĩ git được thiết kế không chấp nhận các cam kết từ xa xóa lịch sử. Hoặc đó là những gì - lực lượng nào? – Paul

+0

Bạn có thể viết lại lịch sử cả ngày, nhưng băm của các cam kết của bạn sẽ thay đổi. Bạn không thể thay đổi nội dung của một cam kết, nhưng bạn có thể sửa đổi nó, tạo ra một cam kết mới của các loại, và bạn có thể xác định lại những gì 'master' của bạn trỏ đến. – tadman

3

Cách lười biếng là chỉ cần thêm tất cả các tập tin mới và những thay đổi, và xóa bỏ:

git add -A . 

Vì vậy, miễn là bạn không có bất kỳ mâu thuẫn, điều này sẽ sáp nhập trong mỹ.

+0

Nhưng tôi không muốn xóa các tệp này khỏi dự án. Vâng, tôi muốn một số người trong số họ được xóa vĩnh viễn (từ repo và một đĩa), nhưng đối với phần còn lại của họ tôi chỉ muốn họ không được trong chỉ số git (để làm cho git không nhìn thấy chúng - cho những người trong .gitignore). Tôi có phải loại bỏ tất cả chúng bằng tay "git rm ..."? –

+0

Âm thanh như những gì anh ta muốn là một lịch sử rõ ràng ... – Mingyu

+0

Bạn luôn có thể di chuyển các tệp này ra khỏi dự án của mình tạm thời, cam kết "xóa", sau đó di chuyển chúng trở lại sau khi chúng sẽ bị bỏ qua từ thời điểm đó trở đi. Sau khi di chuyển, 'git add -A .' sẽ hiển thị các lần xóa này. Sau khi cam kết, nếu '.gitignore' của bạn được thiết lập đúng, di chuyển chúng trở lại sẽ không có hiệu lực trên repo của bạn. – tadman

2

Dưới đây là các bước để tái init kho.

Kịch bản: Tôi đã xóa thư mục dự án cục bộ mà tôi đã thực hiện git init trước đó.Sau đó, tôi muốn cập nhật kho lưu trữ git hiện có với một thư mục mới của cùng một dự án. Sau đó, tôi giải quyết nó bằng cách làm theo thủ tục.

Thủ tục

git init 
git add --all 
git commit -am "re-init" 
git remote add origin https://github.com/{yourgit}/{yourproject}.git 
git push --force origin master 
Các vấn đề liên quan