2012-04-28 49 views
5

Tôi dường như đã mất công việc buổi chiều của mình trong một repo mới. Dưới đây là những gì tôi đã làm:Các tệp giai đoạn, sau đó thêm từ xa, sau đó kéo - và các tệp của tôi đã biến mất

  1. Tạo một dự án mới tại địa phương và thực hiện một số công việc.
  2. Tạo một repo trên github
  3. git init
  4. git add src
  5. git remote add origin [email protected]:Synesso/memx.git
  6. git pull origin master
  7. git add .gitignore
  8. git commit -m 'updated ignore'
  9. git push origin master

Cả repo địa phương và repo github chỉ có hai lần commit. Cam kết ban đầu (được thực hiện bởi github khi tạo dự án) và lệnh thứ hai chỉ bao gồm tệp .gitignore.

Các tệp được thêm ở bước 4 (git add src) không có mặt. Họ cũng không xuất hiện để được dàn dựng.

Bạn có mất các tệp được dàn dựng khi bạn thực hiện git pull không? Tôi có thể lấy chúng bằng cách nào đó không?

trạng thái hiện tại:

$ git status 
# On branch master 
nothing to commit (working directory clean) 

My inital add không nằm trong reflog.

$ git reflog 
c80135d [email protected]{0}: checkout: moving from 999d128ea4e6969f9eacbceebb5f857f2aa5abb0 to master 
999d128 [email protected]{1}: checkout: moving from master to HEAD~1 
c80135d [email protected]{2}: checkout: moving from 999d128ea4e6969f9eacbceebb5f857f2aa5abb0 to master 
999d128 [email protected]{3}: checkout: moving from master to 999d128ea4e6969f9eacbceebb5f857f2aa5abb0 
c80135d [email protected]{4}: commit (amend): updated ignore 
28b4f90 [email protected]{5}: commit: updated ignore 
999d128 [email protected]{6}: initial pull 

history cho thấy rằng tôi đã thêm vào thư mục src, nhưng không cam kết nó:

223 git init 
225 git add src 
229 git add project/Build.scala 
234 git remote add origin [email protected]:Synesso/memx.git 
250 git pull origin master 

Tôi biết git sẽ phàn nàn nếu bạn cố gắng để kéo với các tập tin bẩn hiện nay. Nhưng nó là OK với một kéo mà sẽ xóa sạch các tập tin dàn dựng? Điều đó có vẻ sai.


Tôi vừa thử nghiệm lại quy trình này và có, nó sẽ phá hủy các tệp được dàn dựng.

[email protected]:~/projects$ mkdir x 
[email protected]:~/projects$ cd x 
[email protected]:~/projects/x$ git init 
Initialized empty Git repository in /home/jem/projects/x/.git/ 
[email protected]:~/projects/x$ echo "hi" > hello.world 
[email protected]:~/projects/x$ git add hello.world 
[email protected]:~/projects/x$ git status 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
#  new file: hello.world 
# 
[email protected]:~/projects/x$ ls -asl 
total 24 
4 drwxrwxr-x 3 jem jem 4096 Apr 28 20:56 . 
4 drwxr-xr-x 8 jem jem 4096 Apr 28 20:56 .. 
4 drwxrwxr-x 7 jem jem 4096 Apr 28 20:56 .git 
12 -rw-rw-r-- 1 jem jem 3 Apr 28 20:56 hello.world 
[email protected]:~/projects/x$ git remote add origin [email protected]:Synesso/memx.git 
[email protected]:~/projects/x$ git reflog 
fatal: bad default revision 'HEAD' 
[email protected]:~/projects/x$ git pull origin master 
remote: Counting objects: 7, done. 
remote: Compressing objects: 100% (5/5), done. 
remote: Total 7 (delta 0), reused 3 (delta 0) 
Unpacking objects: 100% (7/7), done. 
From github.com:Synesso/memx 
* branch   master  -> FETCH_HEAD 
[email protected]:~/projects/x$ ls -asl 
total 36 
4 drwxrwxr-x 3 jem jem 4096 Apr 28 20:53 . 
4 drwxr-xr-x 8 jem jem 4096 Apr 28 20:52 .. 
4 drwxrwxr-x 8 jem jem 4096 Apr 28 20:53 .git 
12 -rw-rw-r-- 1 jem jem 59 Apr 28 20:53 .gitignore 
12 -rw-rw-r-- 1 jem jem 9 Apr 28 20:53 README.md 
[email protected]:~/projects/x$ git reflog 
c80135d [email protected]{0}: initial pull 

Tập tin hello.world đã bị xóa mà không cảnh báo.

+1

'git reflog' sẽ hiển thị sửa đổi cây của bạn. Nhưng nếu bạn không bao giờ cam kết các tệp 'src' của mình ... –

+0

Hiện trạng' git' nói gì? – vissi2

Trả lời

7

tôi đã có thể tái sản xuất này mà không sử dụng github, sử dụng hai host (đổi tên ở đây như hostB, đó là "từ xa", và Hosta, đó là "địa phương"):

hostB$ cd /tmp; mkdir repo; cd repo; git init 
Initialized empty Git repository in /tmp/repo/.git/ 
hostB$ : > .gitignore; echo this is a readme > README.md 
hostB$ git add .; git commit -m initial 
[master (root-commit) 58d43bd] initial 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 .gitignore 
create mode 100644 README.md 

hostA$ cd /tmp; mkdir repo; cd repo; git init 
Initialized empty Git repository in /tmp/repo/.git/ 
hostA$ echo hi > hello.world 
hostA$ git add hello.world 
hostA$ git status 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
# new file: hello.world 
# 
hostA$ git remote add origin ssh://hostB.dom.ain/tmp/repo 
hostA$ git pull origin master 
remote: Counting objects: 4, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 4 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (4/4), done. 
From ssh://hostB.dom.ain/tmp/repo 
* branch   master  -> FETCH_HEAD 
hostA$ ls 
README.md 

quan trọng : bạn có thể sử dụng git fsck --lost-found để khôi phục tập tin dàn dựng của bạn:

hostA$ git fsck --lost-found 
Checking object directories: 100% (256/256), done. 
dangling blob 45b983be36b73c0788dc9cbcb76cbb80fc7bb057 
hostA$ 

và chắc chắn đủ, nếu bạn kiểm tra các blob (s) (mà hiện nay được khôi phục trong .git/lost-found/other), những người sẽ có công cụ của bạn bị mất. (Bất kỳ cấu trúc thư mục nào cũng sẽ biến mất và bạn sẽ phải tìm ra tệp nào và đặt lại chúng ở đâu bạn muốn chúng.)

Điều thú vị là nếu bạn git fetch origin theo sau là git merge origin/master, nó sẽ lấy nguồn gốc ban đầu sửa đổi (s) (với các tập tin .gitignore và README.md từ hostB, trong trường hợp này) và giữ lại "thay đổi được cam kết" của bạn. Một lý do khác để ủng hộ git fetch theo sau là git merge? :-)

+0

Đó là ... đẹp. Cảm ơn bạn. – Synesso

+0

Tôi rất cảm kích - ước gì tôi có thể Flattr câu trả lời này! – Treffynnon

+0

@Treffynnon: điều này đã được sửa trong git "chính thức" với cam kết 'b4dc085a8dc2ec2fb5f6366fa672222b807ed655', vào tháng 6 năm 2013 và được bao gồm trong git v1.8.4. – torek

0

Repo của bạn trên github không chứa bất kỳ tệp có giá trị nào. Bạn không quên cam kết chúng sao?

Ngay cả khi chúng không được tổ chức, thư mục srccục bộ ở đâu? Nếu bạn chỉ làm những gì được chỉ định trong câu hỏi, git không thể ăn các tập tin của bạn anyway.

+0

Đó cũng là những gì tôi nghĩ. Nhưng thư mục src không tồn tại cục bộ nữa. – Synesso

0

Tôi nghĩ bạn nên cam kết thay đổi địa phương của bạn sau khi add trước remote addpull

  1. git init
  2. git add src
  3. git add .gitignore
  4. git commit -m 'cập nhật bỏ qua'
  5. git remote add origin [email protected]: Synesso/memx.git
  6. git kéo nguồn gốc chủ
  7. git push nguồn gốc chủ
+0

Tôi nghĩ điều đó là hiển nhiên. – Ashe

1

Tôi tin rằng đây là một tác dụng phụ đáng tiếc của việc có một kho lưu trữ mới w/o một cam kết duy nhất. Nếu bạn cố gắng thử nghiệm của bạn một lần nữa mà thay vào đó thực hiện tại địa phương:

git init; echo "Readme" > Readme; git add Readme; git commit -m 'Initial commit' 

sau đó khi bạn kéo 'vào một thư mục làm việc với các tập tin 'src', GIT sẽ cảnh báo và quan trọng hơn, sẽ không loại bỏ công cụ.

4

tôi nhận được câu trả lời sau đây vào danh sách gửi thư git từ Junio ​​Hamano:


Đây là một trường hợp góc bất ngờ can thiệp nỗ lực của chúng tôi là quá tốt đẹp mà phản tác dụng.

Trong một thời gian dài, không có lịch sử và yêu cầu kéo bị cấm, vì "git pull" là về kết hợp hai (hoặc nhiều) lịch sử với nhau và kéo khi bạn không có lịch sử là một điều vô nghĩa --- bạn chỉ có có một lịch sử (lịch sử từ phía bên kia) và không có gì là để kết hợp. Sau đó, chúng tôi đã cố gắng trở nên đẹp hơn, vì một số người dùng mới đã kích hoạt lỗi khi thực hiện "git init" trong một thư mục trống, tiếp theo là "git pull", bằng cách xác định lại "hợp nhất" vào lịch sử không có nghĩa là đặt lại khác lịch sử.

giải quyết "git init & & git pull" này, nhưng chúng tôi đã không dự đoán ai sẽ làm một "git init & & git add & & git pull" trình tự, mà có không có kết quả lành mạnh khác hơn là chỉ lỗi.

Một bản vá để cho rằng kết quả chỉ có thể trông như thế này.

git-pull.sh | 3 +++ 
1 file changed, 3 insertions(+) 

diff --git a/git-pull.sh b/git-pull.sh 
index 2a10047..da102d0 100755 
--- a/git-pull.sh 
+++ b/git-pull.sh 
@@ -261,6 +261,9 @@ esac 

if test -z "$orig_head" 
then 
+  test $(git ls-files | wc -l) = 0 || 
+  die "$(gettext "Uncommitted changes in the index")" 
+ 
     git update-ref -m "initial pull" HEAD $merge_head "$curr_head" && 
     git read-tree -m -u HEAD || exit 1 
     exit 
+0

Rất thú vị. +1 – VonC

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