Refer:廖雪峰的Git教程
git init # 初始化
git add # 添加文件
git commit -m "first version" # 提交
git status # 查看當前狀態(tài)
git diff file.name # 查看文件修改情況
git log --pretty=oneline # 查看日志
git reset --hard HEAD^ # 強制回退到上一版本
git reset --hard 543264 # 回退到某一版本
git reflog # git命令記錄
工作區(qū)與暫存區(qū)
需要注意的是:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
git checkout -- file.name # 放棄工作區(qū)修改
命令git checkout -- readme.txt
意思就是,把readme.txt文件在工作區(qū)的修改全部撤銷亚情,這里有兩種情況:
- readme.txt自修改后還沒有被放到暫存區(qū)蛔趴,現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài)浪慌;
- readme.txt已經(jīng)添加到暫存區(qū)后萌京,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)颜及。
總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)蹂楣。
用命令git reset HEAD file
可以把暫存區(qū)的修改撤銷掉(unstage)俏站,重新放回工作區(qū)。
rm file.name # 刪除文件
git rm file.name # 在git中刪除文件
checkout -- file.name # 恢復文件
git remote add https://github.com/jlshix/flaskweb.git # 添加遠程庫
git push -u origin master # 第一次推送至遠程庫
git push origin master # 推送至遠程庫
git clone https://github.com/jlshix/flaskweb.git # 克隆遠程庫
# Git支持多種協(xié)議痊土,包括https肄扎,但通過ssh支持的原生git協(xié)議速度最快
head & master
Dev
git checkout -b dev # 新建并切換到dev分支 相當于以下兩條
git branch dev
git checkout dev
git branch # 查看分支
git checkout master # 切換回master分支
git merge dev # 將dev分支合并
git branch -d dev # 刪除dev分支
merge conflict
合并分支時若出現(xiàn)沖突需要手動合并,然后
git add
git commit
解決沖突
使用git log --graph --pretty=oneline --abbrev-commit
查看分支圖
分支管理赁酝,禁用fastforward
$ git checkout -b dev
Switched to a new branch 'dev'
$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge
1 file changed, 1 insertion(+)
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
no fastforward
在實際開發(fā)中犯祠,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩(wěn)定的酌呆,也就是僅用來發(fā)布新版本衡载,平時不能在上面干活;
那在哪干活呢隙袁?干活都在dev分支上痰娱,也就是說弃榨,dev分支是不穩(wěn)定的,到某個時候梨睁,比如1.0版本發(fā)布時鲸睛,再把dev分支合并到master上,在master分支發(fā)布1.0版本坡贺;
你和你的小伙伴們每個人都在dev分支上干活官辈,每個人都有自己的分支,時不時地往dev分支上合并就可以了.
所以拴念,團隊合作的分支看起來就像這樣:
group programming
使用git stash命令可以保存當前工作空間
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
git stash pop
$ git stash apply stash@{0}
開發(fā)一個新feature钧萍,最好新建一個分支褐缠;
如果要丟棄一個沒有被合并過的分支政鼠,可以通過git branch -D <name>
強行刪除。
關(guān)于協(xié)作
- 查看遠程庫信息队魏,使用
git remote -v
- 本地新建的分支如果不推送到遠程公般,對其他人就是不可見的
- 從本地推送分支,使用
git push origin branch-name
胡桨,如果推送失敗官帘,先用git pull
抓取遠程的新提交 - 在本地創(chuàng)建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
昧谊,本地和遠程分支的名稱最好一致 - 建立本地分支和遠程分支的關(guān)聯(lián)刽虹,使用
git branch --set-upstream branch-name origin/branch-name
- 從遠程抓取分支,使用
git pull
呢诬,如果有沖突涌哲,要先處理沖突
標簽管理
打標簽
- 命令
git tag <name>
用于新建一個標簽,默認為HEAD尚镰,也可以指定一個commit id -
git tag -a <tagname> -m "blablabla...
可以指定標簽信息 -
git tag -s <tagname> -m "blablabla...
可以用PGP簽名標簽 - 命令
git tag
可以查看所有標簽
操作標簽
- 命令
git push origin <tagname>
可以推送一個本地標簽 - 命令
git push origin --tags
可以推送全部未推送過的本地標簽 - 命令
git tag -d <tagname>
可以刪除一個本地標簽 - 命令
git push origin :refs/tags/<tagname>
可以刪除一個遠程標簽
git-cheat-sheet