1. 安裝
1). Ubuntu
sudo apt-get instal git
2). 配置
git config --global user.name "Your Name"
git config --global user.email "Your Email"
2. 創建版本庫
1). 創建目錄
mkdir myrespo
2). 初始化版本庫
cd myrespo
git init
3). 創建文件
vi readme.txt
在myrespo目錄下創建一個readme.txt文件,內容如下:
Git is version control system.
Git is free software.
4). 添加修改的文件到stage區域
git add readme.txt
5). 將stage區域中的文件commit到本地的master分支中
git commit -m 'wrote a readme file'
提交變更到本地倉庫,並附有提交信息
6). 查看本地工作區的文件修改狀態
git status
7). 查看文件的不同情況
git diff file
8). 查看commit記錄
git log
or
git log –pretty=oneline
3. 時光機穿梭
1). 回退版本
git reset --hard HEAD^
HEAD:代表當前版本
HEAD^:代表上一個版本
HEAD^^:代表上上個版本
HEAD~100:代表前100個版本
2).查看記錄的命令操作記錄
git reflog
場景:
當你之前恢復到之前的版本,第二天後悔了,通過這個命令查看到昨天的操作指令,指令中有commit id, 這樣就可以通過git reset --hard commit_id回到最新的版本
3).緩存區
git init創建一個git repository之後,我們稱這個目錄爲工作區,在這個工作區中包含一個版本庫,版本庫中包含stage緩存區和master分支,當我們git add文件時,我們只是把文件 加載到stage中,而git commit時,我們是將存放到stage的文件,提交到master分支上。
4).丟棄工作區的修改
場景:
當你在readme.txt文件中添加了如下文本:
my stupid boss still prefers SVN.
當你查看git status時可以查看到哪些文件已經在工作區中修改過了,我們這個例子比較簡單 但是當你修改的文件過多時,那麼丟棄敏感信息就不那麼容易了,這個時候使用如下命令就可以丟棄對工作區的修改:
git checkout – file
注意:git checkout無參數時,是創建一個分支,記着是兩個-
5).丟棄stage中的文件修改
場景:
在4中,你在git add file之前發現問題,那麼如果當你git add文件後,才發現問題的嚴重性時,我們需要使用如下的命令,將丟棄stage中文件的修改:
git reset HEAD file:將已提交到stage中的文件修改丟棄,文件會回到工作區域,之後就需要通過11的操作將敏感數據丟棄掉。
6).刪除文件和無刪除文件後恢復到刪除文件之前
git rm file:刪除文件
當誤刪除文件時,通過11的操作丟棄對工作區的修改,git checkout – file就可以將誤刪除的文件恢復了
總結4和5:
1. 當你該亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout – file。
2. 當你不但亂改了工作區某個文件的內容,還添加了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了第4條,第二步按第4條操作。
4. 遠程倉庫
1). 創建SSH Key(Ubuntu)
ssh-keygen -t rsa -C “[email protected]”
將id_rsa.pub中的字符串存放到你的github賬戶中的ssh管理中
2).將本地的repository與github的repository進行關聯,首先需要在github上建立一個repository,建立的操作比較簡單,照着做就可以了。
> 進入到本地倉庫的目錄
cd Local Repository Directory
> 建立本地倉庫與遠程倉庫的關聯,origin代表遠程的倉庫名
git remote add origin https://github.com:Your Name/Remote Repository Name.git
> 將本地倉庫的所有文件推送到遠程倉庫中,將本地master分支的文件推送到遠程的orgin,第一次需要添加-u參數,它會將本地master分支的文件更新到遠程倉庫的master分支上,還會將本地的master分支與遠程的master分支進行關聯
git push -u origin master
說明:
Local Repository Directory:本地倉庫的倉庫目錄地址
Your Name:這個是你在github的名稱
Remote Repository Name:github上的倉庫的名稱
從現在起,只要本地做了提交,就可以通過命令:
git push origin master
3).從遠程倉庫clone一個項目
當你在github上創建一個項目時,我們想查看項目時,可以通過如下代碼將遠程的項目clone到本地一份
git clone https://github.com/Your Name/Project Name.git
說明:
Your Name:項目創建者的github賬戶名稱
Project Name:項目名稱
github提供很多種協議來進行數據的傳輸,默認採用ssh,我們這裏採用的https
5. 分支管理
1). 創建分支並切換到分支
git checkout -b dev
or
git branch dev
git checkout dev
2). 查看當前分支
git branch
3). 將master分支合併到最新的dev分支
> 切換回到master分支
git checkout master
> 將master分支合併到最新的dev分支,當合並信息中包含Fast-forward爲快速合併,及master指針直接指向dev分支
git merge dev
4). 合併分支後,將不再使用的分支刪除
> 刪除dev分支
git branch -d dev
5). 當處理完衝突之後,使用如下命令查看衝突的內容
git log --graph --pretty=oneline –abbrev-commit
6). 當使用git merge name時,如果是Fast-forward合併方式,那麼合併並不會記錄除master分支的分支信息,使用如下命令將創建一個新的commit,並且要求輸入commit message信息
git merge –no-ff -m “merge with no-ff” dev
git log –graph –pretty=online –abbrev-commit
7). Bug分支
場景:當前你正在dev分支上開發東西,但是現在有一個緊急bug需要修復,這個時候我們可以將正在做的dev分支進行儲存,然後新建bug分支處理bug,等處理完bug,將儲存的dev分支重新提取出來接着進行開發
> 儲存dev分支
git stash
> 假定在master上處理bug
git checkout master
git checkout -b issue-101
/* 修復bug */
> 修復完bug後,切換回master分支,合併分支,刪除bug分支
git checkout master
git merge –no-ff -m “merged bug fix 101” issue-101
git branch -d issue-101
> 提取存儲的dev分支
git checkout dev
git stash list // 查看存儲的分支信息
提取有兩種方法:
git stash apply,但stash內容並不刪除,需要git stash drop刪除
git stash pop提取並刪除
git stash //再次查看存儲列表
8). Feture分支
場景:當我們開發新功能時,我們希望新建一個功能分支在上面開發,完成後,合併,最後刪除該分支。但是如果當你完成新功能時,準備合併到dev分支時,突然,由於種種原因,新功能目前不能添加。那麼這個時候需要刪除心功能分支,當你用git branch -d name時,錯誤提示,當前分支並沒有與其他分支進行合併,如果想徹底刪除該分支,需要使用-D參數
9). 多人協作的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖合併;
如果合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream branch-name origin/branch-name。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
10). 標籤管理
> 分支內打標籤
git checkout name
git tag tag_name
> 根據commit id打標籤
場景:如果現在是週五,但是本來週一打的標籤沒有打,通過git log查看到commit id後,然後通過命令git tag tag_name commit_id進行對特定commit打標籤
11). 查看所有的tag
git tag
12). 根據tag_name查看commit信息
git show tag_name
13). 打標籤的同時,添加標籤消息
git tag -a tag_name -m “message” commit_id
14). 刪除本地標籤
git tag -d tag_name
15). 推送標籤到遠程
git push origin tag_name
or
git push origin –tags:一次性推送所有的標籤
16). 刪除遠程標籤
git push origin :refs/tags/tag_name
6. 過濾文件
https://github.com/github/gitignore有完整的說明,只需要根據自己的實際情況將內容填入到.gitignore文件中
7. 配置別名
st表示status,co表示checkout,ci表示commit,br表示branch,unstage表示將修改恢復到工作區,last表示顯示最後一次提交的log信息,lg表示新的日誌信息顯示格式:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
8 分支總結
查看分支:git branch
創建分支:git branch name
切換分支:git checkout name
創建+切換分支:git checkout -b name
合併某分支到當前分支:git merge name
刪除分支:git branch -d name
9 . 標籤總結
命令git tag name用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;
-a tagname -m "blablabla..."可以指定標籤信息;
-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可以刪除一個遠程標籤。
10. 版權所屬
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000