git原理的理解

Git原理的理解

git分區:

  • 遠程倉庫
  • 本地倉庫
  • 工做區
  • 緩存區
git主要由這幾個分區組成,git的各類命令其實也是圍繞這幾個分區來展開的,接下來將經過這幾個分區來理解git的各類操做;
git init
  • git init 操做是初始化一個git本地倉庫,工做區,和緩存區,此時尚未遠程倉庫與其同步;
git clone

clipboard.png

  • git clone直接將遠程倉庫和本地倉庫以及工做區間同步
git add
  • 平時對代碼的操做,實際是在工做區操做,當對代碼修改完畢後,就會使用git add;git add 操做是將工做區的文件加入到緩存區中;
git commit
  • 當須要將本地修改完成的代碼提交到遠程時,須要使用git commit命令;這一命令是將緩存區的代碼提交到本地倉庫;
git 切換分支時會把未add或未commit的內容帶過去,這一點值得注意。爲何呢?由於未add的內容不屬於任何一個分支,未commit的內容也不屬於任何一個分支。也就是說,對於全部分支而言,工做區和暫存區是公共的。
要想在分支間切換, 又不想又上述影響, 怎麼辦呢? git stash搞起。要注意,在當前分支git stash的內容, 在其餘分支也能夠git stash pop出來,爲何? 由於:工做區和暫存區是公共的。
git push origin 分支名
  • 當要把代碼從本地倉庫提交到遠程倉庫時,則使用git push,將本地倉庫的代碼提交到遠程倉庫;

clipboard.png

git push = git fetch + git merge

clipboard.png

  • git fetch操做首先將遠程倉庫同步到本地倉庫,git merge操做將本地倉庫合併到工做區;所以git pull操做最終的效果就是將遠程倉庫的最新代碼合併到了工做區
有時候在git push的時候,經常會出現push被阻止的狀況,這是由於遠程倉庫被其餘人更新了,當前分支落後了其餘人的commit,須要先將遠程分支pull到本地工做區,再看有沒有衝突(多人同時修改了一個文件),如有衝突則解決衝突之後再進行提交;

但有時候還會出現git pull失敗的狀況:
clipboard.png
這是由於本地工做區間跟遠程倉庫的新代碼衝突了:
clipboard.png
這時須要解決衝突後提交本地修改。
緩存區 除了開始出現外,後續提交代碼、更新代碼篇章都在打醬油;終於,此次衝突解決事件, 它將會是主角
解決衝突後提交本地修改的思路大概以下:
1.將本地修改的代碼放在緩存區;
2.從遠程倉庫拉取最新代碼;
3.拉取成功後再從緩存區將修改的代碼取出, 這樣最新代碼跟本地修改的代碼就會混雜在一塊兒;
4.手工解決衝突後;
5.提交解決衝突後的代碼;
clipboard.png
clipboard.pnghtml

  • 具體的操做步驟以下:
1.git pull
出現報錯信息:
error: Your local changes to the following files would be overwritten by merge:
README.md
Please, commit your changes or stash them before you can merge.
Aborting

2.git stash

3.git pull

4.git stash pop

clipboard.png

5.手工解決衝突後:
git add README.md

6.git commit -m 'solve conflict'

7.git push origin

clipboard.png

撤銷操做

git reset --soft HEAD^

這樣就撤銷了commit操做,可是代碼仍然保留了下來java

說明:

HEAD^的意思是上一個版本,也能夠寫成HEAD~1
若是你進行了2次commit,想都撤回,可使用HEAD~2git

--mixed 默認參數,
git reset --mixed --soft HEAD^與
git reset --soft HEAD^是一個效果

--soft,
不刪除工做空間改動代碼,撤銷commit,不撤銷add

--hard
刪除工做空間改動代碼,撤銷commit,撤銷add,
完成這個操做後就恢復到了上一次commit的狀態

若是commit註釋寫錯了,只是想改一下注釋,只須要:
git commit --amend
此時會進入默認vim編輯器,修改註釋完畢後保存就行了。

撤銷add  
git reset HEAD 若是後面什麼都不跟的話 就是上一次add 裏面的所有撤銷了   
git reset HEAD XXX/XXX/XXX.java 就是對某個文件進行撤銷了

關於git的config文件

在git中,咱們使用git config 命令用來配置git的配置文件,git配置級別主要有如下3類:github

  • 倉庫級別 local 【優先級最高】
這個配置文件一般位於clone後代碼倉庫的.git隱藏目錄下的config文件
  • 用戶級別 global【優先級次之】
這個配置文件一般位於
~/.gitconfig 文件,具體到你的用戶。你能夠經過傳遞 --global 選項使 Git 讀或寫這個特定的文件
  • 系統級別 system【優先級最低】
/etc/gitconfig 文件:包含了適用於系統全部用戶和全部庫的值。若是你傳遞參數選項’--system’ 給 git config,它將明確的讀和寫這個文件

具體的操做指令就不在贅述,網上能搜索到不少相關的文檔和資料;
在最近的一些學習過程當中,發現一個問題;若本地有兩個不一樣的代碼倉庫,想分別用不一樣的用戶去提交,該如何操做呢?
由上面的背景知識就能夠知道,咱們可使用倉庫的local級別配置文件來給每一個倉庫設置不一樣的用戶;vim

git config user.name "wzj"
git config user.email "wzj@qq.com"

這樣就能夠不一樣倉庫使用不一樣用戶去提交了;緩存

沒有權限提交到git倉庫的解決方法

在學習過程當中,當clone後的倉庫修改後,提交時卻出現了編輯器

remote: Permission to bytewang123/basic.git denied to bytewong.
fatal: unable to access 'https://github.com/byte/basic.git/': The requested URL returned error: 403

經過顯式的在config文件的url中增長
https://git用戶名@
github.com/...,便可解決學習

完整示例:fetch

[remote "origin"]
url = https://git用戶名@github.com/git用戶名/倉庫名.git

常見問題彙總

  • git status出現提示Your branch is ahead of 'origin/master' by 1 commit

當運行 git status ,git會將本地分支dev與它正在跟蹤的遠程分支進行比較(origin/master),由於origin/master沒有被改變,它仍然是當前dev分支(和origin/dev)後面的1提交/更改,因此會出現提示。url


參考文章:
https://www.cnblogs.com/cb032...
https://blog.csdn.net/w958796...
https://www.cnblogs.com/aries...
https://my.oschina.net/newcha...

相關文章
相關標籤/搜索