Git 問題及總結


1. pull時出現合並沖突

You have not concluded your merge (MERGE_HEAD exists). Please, commit your changes before you can merge.

錯誤的原因是以前pull下來的代碼不能自動合並而導致的,必須先撤銷合並在pull。

1) 撤銷合並

git merge –abort [Since git version 1.7.4]

git reset –merge [prior git versions]

2) 解決沖突.

3) add and commit the merge.

4) git pull now should work fine.

2. pull文件時和本地文件沖突

在沒有保存本地文件修改下執行pull命令時,git會提示使用stash或者commit命令,也就是有兩種解決方案。第一就是先add然后commit,最后執行pull,有沖突就解決。另一種就是使用stash命令。

1) 先將本地修改存儲起來

$git stash

使用用git stash list可以看到保存的信息

2) 執行pull命令

3) 還原暫存的內容

$git stash pop stash@{0}

系統提示如下類似的信息:

Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c

意思就是系統自動合並修改的內容,但是其中有沖突,需要解決其中的沖突。

4) 解決文件中沖突的的部分

打開文件解決沖突。解決完成之后,就可以正常的提交了。

3. push被拒絕

[rejected] master -> master (fetch first)

原因是沒有同步遠程的master,所以我們需要先同步一下

1) 首先pull一下

2) 如果有沖突就解決沖突並提交,最后push即可。

3) 如果沒有沖突那么直接進行push即可。

4. push過程中錯誤

error: RPC failed; result=22, HTTP code = 411搜索
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly

原因是:默認 Git 設置 http post 的緩存為 1MB,使用命令將git的緩存設為500M:

git config http.postBuffer 524288000

再嘗試push操作,問題解決,部署成功!

打開項目中隱藏的.git文件夾,找到config配置文件,在后天添加如下配置:

[http] postBuffer = 524288000 

5. 從detached HEAD狀態解救出來

在處於游離狀態的時候,使用 git status命令查看的時候,將不會看到任何的創建的本地分支

1) 創建一個臨時分支

$git branch temp commit_id

//commit_id的值可以查看終端的命令 根據不同情況執行不同的查詢語句

2) 切換回工作分支,並合並剛剛新建的分支

$git checkout dev

$git merge temp 

$git push

3) 最后刪掉之前創建的分支

$git branch -d temp

6. 撤銷文件修改

  • git checkout – file;撤銷對工作區修改;這個命令是以最新的存儲時間節點(add和commit)為參照,覆蓋工作區對應文件file;這個命令改變的是工作區。

  • git reset HEAD – file;清空add命令向暫存區提交的關於file文件的修改(Ustage);這個命令僅改變暫存區,並不改變工作區。

  • git reset –mixed;此為默認方式,不帶任何參數的git reset,就是這種方式,它回退到某個版本,只保留源碼,回退commit和stage信息。

  • git reset –soft;回退到某個版本, 只回退了commit的信息,不會恢復stage(如果還要提交,直接commit即可)。

  • git reset –hard;徹底回退到某個版本, 本地的源碼也會變為上一個版本的內容。

7. 使用.gitattributes

開發時我們將代碼從開發分支合並到測試分支,有時並不希望把配置文件同時被和並進來,我們可以使用.gitattributes文件在合並時忽略某些文件,使用.gitattributes來告訴git對項目特定的文件使用不同的merge strategies,一個.gitattributes文件如下:

src/com/bcx/push/PushUtils.java merge=ours
src/com/nd/push/PushUtils.java merge=ours
src/com/dkw/push/PushUtils.java merge=ours
src/com/pet/push/PushUtils.java merge=ours

要想使.gitattributes有效,使用前應做如下設置:

git config --global merge.ours.driver true

8. reset與revert區別

• git reset是直接刪除指定的commit,把HEAD向后移動了一下

• git revert是一次新的特殊的commit,HEAD繼續前進,本質和普通add commit一樣,僅僅是commit內容很特殊:提交的內容是與前面普通commit文本變化的反操作。

由於reset方式HEAD指針后移,推送到遠端時需要有強制更新權限或者刪除分支權限。

8. 關於歷史記錄

1) 修改歷史提交記錄

git commit –amend

該命令與下面的語句等價

//將branch的頭指針向前移動一個commit,--soft選項使得index和workspace tree的內容保持移動之前不變
git reset --soft HEAD^  

//-c選項使得新提交的log message重用ORIG_HEAD指向的commit使用的log message,但允許用戶編輯
git commit -c ORIG_HEAD  

ORIG_HEAD,用於指向前一個操作狀態,每次的commit或者pull或者reset,git 都會把老的HEAD拷貝到.git/ORIG_HEAD,通過對ORIG_HEAD的引用可 以指向前一次的操作狀態

2) Git reset –soft HEAD~5這個命令,把這5條commit當做一次提交。這對於重塑歷史非常有用。

3) 修改提交樹

  • 使用rebase

Rebase命令可以把已存在的提交,放到重新開始的一個分支上。Git rebase master 將當前所在分支的提交放到master分支上。Rebase命令能夠讓你優化倉庫歷史的清晰度。

git rebase –i HEAD~3
//3代表最后三次提交

執行該命令會在終端出現一個交互頁面(vim的編輯窗口),我們將第2,3行pick改為squash,這個意義為將最后三次的提交壓縮到倒數第三次的提交。

然后我們保存退出,git會一個一個壓縮提交歷史,如果有沖突,需要修改,修改的時候要注意,保留最新的歷史,不然我們的修改就丟棄了。

//保存修改
git add .
//繼續下一次rebase
git rebase --continue

直到三次壓縮完成后,提交到遠程倉庫。

  • 使用cherry-pick

git cherry-pick C2 C4

執行上面的命令,Git 就將被C2 C4兩次提交抓過來放到當前分支下了。

這里寫圖片描述 這里寫圖片描述


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com