Git 學習心得
參照廖雪峯老師的Git教程
Git命令
git init
用於在一個文件夾中創建git的一些倉庫文件信息,可以用ls -a查看該文件
git add “filename”
用於將文件添加到本地的倉庫,可以看做是把文件添加到一個暫存區中
git commit -m “comment”
用於將暫存區中的文件添加到倉庫中, -m後面的comment是對本次提交的說明
git status
查看工作區(文件夾)中是否有文本文件發生過改動,也就是把工作區和版本庫的內容對比
git diff
如果git status命令報告有文件修改過,那麼可以用git diff查看具體的修改內容
git diff顯示內容的意義:
減號’-‘表示上一次提交到倉庫中的文本內容,加號’+’表示本次修改後的文本內容。
@@ -1,3 +1,5 @@ 表示上一次提交的文本有3行,本次修改後有5行
若顯示的內容前面沒有’+’和’-‘,說明這是兩個文本共有的
顯示的內容前面有’+’說明是本次修改後的文本獨有的
顯示的內容前面有’-‘說明是上一次提交的文本獨有的。
git log
使用git log可以查看commit的記錄,加上參數 –pretty=oneline可以只顯示版本號和註釋
git reset
版本之間進行回退與恢復,完整命令爲:git reset –hard HEAD
其中HEAD
是表示回退到當前版本的上一版本。因爲HEAD相當於一個指針,指向當前分支,^表示向前一個版本,若要回到當前版本的前n個版本,可以把HEAD改爲HEAD~n
以上的命令爲向前回退,若要向後恢復,那麼可以通過版本號的查找恢復:
使用git log可以查看到版本號,然後可以通過把–hard後面的參數改成版本號,即可恢復到後面的版本,如果通過git log無法查看到想要恢復到的版本號,那麼可以使用git reflog查看之前打過的git命令,從而找到版本號
工作區 和 版本庫 的關係
通過git init創建了版本庫,然後每次要把工作區(文件夾)中的文本提交到版本庫中都是先用git add命令提交到stage(暫存區),然後用git commit命令提交到master分支中,前面說的版本之間的回退與恢復也是在master中利用了版本號,而HEAD指針指向master最後一個版本號(當前版本)
在commit之後使用git status,顯示工作區clean,表示暫存區的內容與最近一次提交同步,但是暫存區還是有內容的。
如果在修改之後沒有add到暫存區,那麼commit是不會把最新的修改提交到版本庫當中的。因爲commit只是把add到stage中的修改提交到版本庫。
git diff –cached
用於查看暫存區(stage)與上一次最近一次commit的內容有無不同。
git diff HEAD –filename
用於對比版本庫master分支中的最近一次修改的文件與本地文件的不同
撤銷修改的方法
git checkout – filename
用於把工作區(文件夾)的修改撤銷,用版本庫中的版本替換掉工作區的版本,前提是沒有用add添加到暫存區
git reset HEAD filename
用於把暫存區的修改撤銷,但是並沒有撤銷工作區的修改,這時可以通過git checkout命令撤銷工作區的修改
git reset –hard HEAD^
如果沒有提交到遠程版本庫,可以用版本回退撤銷修改,否則就不能撤銷了。
git rm filename
用於把版本庫中的內容刪除掉,此時工作區中的內容也被刪掉了,如果誤將工作區的內容刪掉,但是版本庫中還未刪除,則可以用git checkout –filename用版本庫中的內容恢復到工作區中
遠程倉庫
1st step:創建SSH KEY
ssh-keygen -t rsa -C “email”用於生成一對公鑰私鑰
然後在github網站中添加ssh key,就可以在以後提交到github倉庫的時候通過認證,表明身份。
2nd step:在github新建倉庫,關聯本地倉庫
git remote add origin git@server-name:path/repo-name.git
注意:origin是遠程倉庫的名字,可以修改,但是一般默認是origin,後面的repo-name是在github新創建的倉庫的名字。在執行本條命令的時候需要在本地倉庫中執行,也就是在已經進行過git init的文件夾中執行。
git push -u origin master
3rd step:推送修改到github倉庫
在關聯後第一次推送是推送master分支的內容到遠程倉庫的master分支,並與之關聯,所以第一次推送需要用到-u 參數
git push -u origin master
再以後的推送中,不需要使用-u參數
git push origin master 這是把本地master分支推送到遠程倉庫中
4nd step:克隆到本地倉庫
git clone ssh-address
其中ssh是指那個遠程倉庫的ssh協議地址,使用ssh協議速度快,但是可能在公司內部無法使用,需要使用https協議地址,但是本質都是一樣的。通過git clone命令可以把遠程倉庫的內容全部克隆到當前文件夾中並新建一個文件夾命名爲遠程倉庫的名字
分支管理
每一個分支都相當於一條時間線,有自己的指針,指向最後提交的版本號,HEAD指向的是當前分支的指針
創建並切換分支
默認是隻有一個master分支,可以隨意進行切換
創建分支:git branch new_branch_name
切換分支:git checkout new_branch_name
當然也可以只用一條命令創建並切換分支:git checkout -b new_branch_name
git branch 查看當前分支,分支前面標有*的是當前分支
git merge branch_name 合併分支到當前分支
git branch -d branch_name 刪除分支
合併分支
在合併分支的時候可能出現衝突,需要手動解決衝突之後才能自動合併分支。如果沒有衝突,就可以用前面所寫的命令git merge branch_name 合併分支到當前分支
如果有衝突,可能是如下的情況,兩條分支都有新的提交:
這時候不能自動合併分支,這時候可以用git status查看導致衝突的文件是什麼,然後手動修改即可,如下面的衝突情況:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
==== = = =
Creating a new branch is quick AND simple.
.>>>>>>> feature1
其中<<到>>的是衝突的地方,在行末都有標出衝突的分支是什麼,用==分割出有衝突的具體內容,可以修改這一整段以解決衝突
衝突解決後的分支情況如下:
使用帶參數的git log查看分支合併情況:
git log –graph –pretty=oneline –abbrev-commit
一般來說,不需要用到的分支要及時刪除掉。
一個小問題
在使用git merge的時候,是用了fast forward模式,這樣的話用git log是看不出來進行過分支合併,而有時候需要在log中記錄合併的信息,就需要用到普通模式(遞歸模式)進行合併分支
git merge –no-ff -m “comment”
在普通模式下合併分支可以加上註釋。合併後可以從歷史中看出合併記錄:
通常master只發布穩定版本,在dev分支中進行開發,而每個成員在自己的分支中開發,然後提交到dev分支,最後經過測試才提交到master分支
修復bug
在修復bug的時候需要單獨創建一個分支以處理bug,在這時候可能正在dev分支進行開發,所以需要先保存dev現場,但是不是提交到倉庫中。
git stash 命令可以保存當前分支的內容,就像是函數調用一樣,現場保護之後可以在之後恢復。
在保存完現場之後可以去到需要修復bug的分支進行修復,最後回到dev分支繼續開發,但是這時候git status顯示工作區是clean的,因爲已經把所有內容保存到了stash中。所以,這時候需要用這個命令恢復現場:
git stash list: 顯示當前stash列表裏面保存了的工作區內容
git stash apply 以stash列表的第一個進行恢復
git stash apply stash@{1} 以stash列表的第二個進行恢復
需要注意的是,用apply恢復後在stash列表中還是存在之前保存的內容,需要用git stash drop刪除
另一種更爲方便的是在恢復的同時刪除stash列表中的內容:
git stash pop
注意
如果在master分支修復bug之後需要把修復後的master內容同步到dev分支,則先轉換到dev分支,再進行merge就可以了
feature分支(爲新功能的開發創建的分支)
如果一個分支在合併之前就確認需要刪除,也就是說這個分支的內容不再需要了,那麼刪除這個分支需要用到的命令爲:
git branch -D branch_name
注意這裏的D是大寫,如果是合併過的分支需要刪除,用的是小寫的d
分支推送與抓取
推送:
git remote -v 查看遠程倉庫版本信息
首先用git remote查看遠程倉庫名,默認是origin
然後可以用git push origin branch_name
把分支推送到origin遠程倉庫中去
抓取:
git pull
如果推送失敗,一般是先通過git pull 抓取遠程倉庫中的新版本,然後和本地倉庫的相應分支合併,然後再推送到遠程倉庫中去。使用pull的時候需要先把本地倉庫的分支和相應的遠程倉庫的分支進行關聯,命令如下:
git branch –set-upstream branch-name origin/branch-name
一次把所有分支的更新抓取到本地倉庫,可以用命令:git fetch origin, 如果在後面繼續加上分支名,那麼就和pull一樣的作用
標籤
標籤相當於指針,是指向commit的指針,但是和分支管理中的HEAD指針不一樣,標籤是不可移動的,只能創建和刪除
創建標籤
git tag tag_name
這裏是對最近一次commit打標籤
如果要對之前的某此commit打標籤,需要增加一個參數(commit id)
比如某次commit的id是6eabc123,那麼可以用一下方式打標籤:
git tag v1.0 6eabc123
標籤也可以用註釋,直接在後面加參數-m ”comment“即可
git tag v1.0 6eabc123 -m “this is a tag”
查看標籤內容:
git show tag_name
比如
git show v1.0
git tag 查看所有標籤
推送標籤
git push origin
推送某個本地標籤
git push origin –tags 推送本地所有標籤
git tag -d
刪除本地某個標籤
git push origin :refs/tags/
刪除遠程某個標籤
注意:在刪除遠程標籤之前需要先刪除本地標籤。
參與github開源項目
fork
fork他人的項目到自己的遠程倉庫中,然後clone到本地倉庫進行開發,如果想要對方接受自己的代碼,可以用pull request進行推送,如果對方接受,就成功推送。
pull request
想要對方接受自己的代碼,首先就需要保證自己的代碼能夠被對方自動merge,也就是不能跟對方的主分支有衝突。