sudo apt-get install git -y
建立一個版本庫git
git init
建立一個版本github
git add test.txt git commit -m 'v1.0'
查看工做區狀態服務器
get status
查看版本記錄ssh
git log git log --pretty=oneline 將每次提交放到一行顯示 git log --pretty=oneline --graph 以圖形化方式顯示每次提交
版本回退分佈式
git reset --hard HEAD^ 其中HEAD表示當前最新版本,一個^表示回退一個版本,有幾個^表示回退幾個版本 git reset --hard HEAD~1 1表示回退一個版本,那麼10就是回退10個版本 git reset --hard HEAD
查看操做記錄ide
git reflog
echo 'this is first line' >> test.txt git add test.txt echo 'this is first line' >> test.txt git commit -m 'v1.1' git status # 發現第二次修改test.txt文件後,並無真正的加入到工做區,因此並無提交到版本庫 On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a")
撤銷對test.txt文件的修改this
get checkout -- test.txt
若是要撤銷暫存區的修改時3d
git reset HEAD test.txt
對比工做區中的test.txt文件和版本庫中的有什麼不一樣版本控制
git diff test.txt HEAD -- test.txt
對比兩個版本中test.txt文件的不一樣指針
git diff HEAD HEAD^ -- test.txt
咱們將目錄中的test.txt刪除,git知道咱們刪除了文件,可是工做區和版本庫就不知道了,因此咱們執行git status就能夠知道哪些文件被刪除了
rm -rf test.txt git status
如今咱們有兩個選擇,一是肯定這個文件要被刪除,二是肯定這個文件誤刪
# 1. git rm test.txt git commit # 2. git checkout -- test.txt
git把咱們每次提交的版本造成一條時間線,這個時間線就是一個分支,目前,這個分支叫master,每次提交後HEAD指向master,master指向提交,每次提交,master都會向前移動一步,因此這條時間線愈來愈長,當咱們建立分支slave後,HEAD指向slave,指向新提交,今後,再次提交就會將版本提交到slave分支,而master不變,當咱們在salve分支上的工做完成了,就能夠合併分支
合併也不是一路順風的,好比說,我在工做區中有一個test.txt文件,這個文件中沒有任何數據,我在master分支中向第一行增長了一行數據,提交到版本庫中,而後切換到slave,在這個文件中新增長了一行數據,而後提交到版本庫中,再進行合併就會出現衝突
kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git checkout -b slave Switched to a new branch 'slave' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ cat test.txt master:the new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ vi test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ cat test.txt master:the new code slave:the new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git add test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git commit -m '1.2' [slave 5035bfb] 1.2 1 file changed, 1 insertion(+) kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git checkout master Switched to branch 'master' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ cat test.txt master:the new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ vi test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ cat test.txt master:the new code master:the new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git add test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git commit -m '1.3' [master e46f9b7] 1.3 1 file changed, 2 insertions(+) kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git merge slave Auto-merging test.txt CONFLICT (content): Merge conflict in test.txt Automatic merge failed; fix conflicts and then commit the result. # 解決衝突 kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master|MERGING) $ cat test.txt master:the new code <<<<<<< HEAD master:the new code ======= slave:the new code >>>>>>> slave kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master|MERGING) $ vi test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master|MERGING) $ cat test.txt master:the new code slave:the new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master|MERGING) $ git add test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master|MERGING) $ git commit -m '1.4' [master b252477] 1.4
一般,合併分支時,git會盡量的使用fast forward模式,可是有時候快速合併無成功可是也沒有衝突,這個時候會合並以後作一次新的提交
kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ vi test1.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ cat test1.txt add new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git add test1.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git commit -m '1.5' [slave 5fa46e2] 1.5 1 file changed, 1 insertion(+) create mode 100644 test1.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git checkout master Switched to branch 'master' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ vi test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ cat test.txt master:the new code slave:the new code master:add new code kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git merge slave Merge made by the 'recursive' strategy. test1.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test1.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git log --pretty=oneline bee1e463867f605f16c3fbad6a50ea36f4e0b20a (HEAD -> master) 合併slave分支 5fa46e2ec62346526554b04b62a468afbde0f9ba (slave) 1.5 b2524777899baab52783e1b49360fedc1e6a7e50 1.4 e46f9b7b5c379238ddca5db70746bc4f9f8c5edc 1.3 5035bfba43172b02bdbb7447fd9ebb018e6f49f5 1.2 2ae2bcac4258f41cb1a1e3a3a81a572be80c28f9 1.1 8d3dee945a68e5996d9c088a9769f43fc5c75228 1.0 kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git log --pretty=oneline --graph * bee1e463867f605f16c3fbad6a50ea36f4e0b20a (HEAD -> master) 合併slave分支 |\ | * 5fa46e2ec62346526554b04b62a468afbde0f9ba (slave) 1.5 * | b2524777899baab52783e1b49360fedc1e6a7e50 1.4 |\ \ | |/ | * 5035bfba43172b02bdbb7447fd9ebb018e6f49f5 1.2 * | e46f9b7b5c379238ddca5db70746bc4f9f8c5edc 1.3 |/ * 2ae2bcac4258f41cb1a1e3a3a81a572be80c28f9 1.1 * 8d3dee945a68e5996d9c088a9769f43fc5c75228 1.0 kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git branch -d slave Deleted branch slave (was 5fa46e2).
可是快速合併分支後刪除分支會丟失掉分支信息,因此咱們不少時候須要禁用快速合併
kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git checkout -b slave Switched to a new branch 'slave' M test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ vi test2.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git add test2.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git commit -m '1.6' [slave 1e833e6] 1.6 1 file changed, 2 insertions(+) create mode 100644 test2.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git checkout master Switched to branch 'master' M test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git merge --no-ff -m '禁用快速合併' slave Merge made by the 'recursive' strategy. test2.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 test2.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git log --graph --pretty=oneline * cabeb0f4edc6617d27e1a7624be927a0f5f7da59 (HEAD -> master) 禁用快速合併 |\ | * 1e833e62109f3dd266883834bf11014d85c4a3dc (slave) 1.6 |/ * bee1e463867f605f16c3fbad6a50ea36f4e0b20a 合併slave分支 |\ | * 5fa46e2ec62346526554b04b62a468afbde0f9ba 1.5 * | b2524777899baab52783e1b49360fedc1e6a7e50 1.4 |\ \ | |/ | * 5035bfba43172b02bdbb7447fd9ebb018e6f49f5 1.2 * | e46f9b7b5c379238ddca5db70746bc4f9f8c5edc 1.3 |/ * 2ae2bcac4258f41cb1a1e3a3a81a572be80c28f9 1.1 * 8d3dee945a68e5996d9c088a9769f43fc5c75228 1.0
軟件開發中,出現bug是常常性的事情,在git中,每一個bug能夠經過一個臨時分支來修復,修復後刪除分支,假如忽然出現一個bug就須要當即修復,可是該分支的工做尚未完成,沒有完成就沒辦法進行提交,因此就用到了git中的保存現場功能(stash)
kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git stash Saved working directory and index state WIP on master: cabeb0f 禁用快速合併 kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git status On branch master nothing to commit, working tree clean kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git checkout slave Switched to branch 'slave' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git checkout -b bug001 Switched to a new branch 'bug001' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (bug001) $ vi test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (bug001) $ git add test.txt kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (bug001) $ git commit -m 'bug001修復完成' [bug001 aab106b] bug001修復完成 1 file changed, 1 deletion(-) kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (bug001) $ git checkout slave Switched to branch 'master' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git merge bug001 Merge made by the 'recursive' strategy. test.txt | 1 - 1 file changed, 1 deletion(-) kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git branch -d bug001 Deleted branch bug001 (was aab106b). kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (slave) $ git checkout master Switched to branch 'master' kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git stash list stash@{0}: WIP on master: cabeb0f 禁用快速合併 kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git stash pop gOn branch slave Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (8fe9c203f75afc7929433faabc52e02a6d555ff4) kernel@DESKTOP-67P59AO MINGW64 /d/Codes/Git/test (master) $ git status On branch slave Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a")
若是某臺機器須要與GitHub進行交互,那麼就要把這臺機器的ssh公鑰添加到GitHub帳戶上
編輯.github文件,使用ssh-keygen -t rsa -C "郵箱地址",生成ssh密鑰
git clone 項目地址
git push origin 分支名稱
git branch --set-upstream-to=origin/slave master
當本地成功跟蹤遠程分支後,當修改代碼後,只須要git push就能夠將修改提交到遠程
git pull origin 分支名稱