前言
很多大型公司多人協作,代碼都採用Git進行集中管理,我個人所在公司也是如此,覺得多熟悉一些會對工作有幫助。
文章內容主要包含以下幾方面
- Git 簡介
- 安裝Git
- 創建版本庫(Git命令的使用)
- 代碼版本的管理
- 倉庫分支的理解
- 標籤管理
內容:Git簡介
- 概念:Git是最先進的分佈式版本控制系統;
- 歷史:
linus 在1991年創建了開源的Linux ,linus堅定反對CVS和SVN,認爲與Linux的開源精神不符合, 之後的代碼迭代中選擇了商業版Bitkeeper(東家BitMover),被授權免費使用這個版本控制系統。 但後來開源社區牛人破解Bitkeeper協議,東家生氣收回Linux社區免費使用權, Linus兩週寫了Git版本控制系統。
集中式 vs 分佈式
內容:安裝Git
- Linux安裝Git ,Git命令; 或者 sudo apt -get install git
- Mac OS安裝, 通過homebrew安裝,或者xcode download Command Line Tools
內容:創建版本庫(命令的使用)
$ git init
瞬間 Git倉庫建好了,並且是一個空的倉庫,目錄下多了一個.git的目錄,跟蹤管理版本庫的。 可用 $ ls -ah 命令看見;
$ git add readme.txt
$ git commit -m “wrote a readme file “ (-m輸入的本次提交的說明)
$ git status : 讓我們隨時掌握倉庫當前的狀態
$ git diff : 查看文件的不用之處
內容:版本的回退機制,管理修改,撤銷修改,刪除
- Git當中,每次文件修改到一定程度的時候,都可以“保存一個快照”,這個快照被稱作commit. 如果誤刪了文件,還可以從最近的一個commit恢復。
$ git log : 查看文件的改動,顯示從最近到最遠的提交日誌
如果嫌輸出信息太多,可以使用參數
$ git log --pretty=oneline
- commit id : 十六進制的,採用SHA1計算出來的一個非常大的數字,避免衝突。
- Git當中 HEAD表示當前版本,上一個版本就是HEAD^ ,上上一個版本就是 HEAD ^ ^ , 往上100個版本寫成 HEAD~100
- Git內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git修改指針指向
回退到上一個版本:
$ git reset --hard HEAD^ (--hard參數意義?)
回退成功可查看文件比如:
$ cat a.txt
指定回到未來的某個版本:
$ git reset --hard 36233332(數字代表commit id)
恢復了又後悔了怎麼辦? 找不到 commit id ?
$ git reflog 記錄每一次的命令,可以找到 commit id
工作區和暫存區
- 工作區(working Directory): 電腦裏能看到的目錄;
- 版本庫(Repository): 工作區有一個隱藏目錄.git,不算工作區,而是Git的版本庫; Git版本庫最重要的是稱爲state(或者index)的暫存區,還有git自動創建的第一個分支master,以及指向master的一個指針HEAD。
如圖:
提交的文件修改通常放到暫存區,然後,一次性提交暫存區的所有修改。
Git管理的是修改,git add 命令後,工作區的第一次修改被放入了暫存區,準備提交,但是第二次修改沒有放入暫存區,git commit 只負責把暫存區的修改提交了。
$ git diff HEAD -- a.txt
查看工作區和版本庫裏面最新版本的區別
撤銷修改:
1. a.txt 還沒有放到暫存區,撤銷修改就回到和版本庫一模一樣的狀態;
2. a.txt已經添加到暫存區,又作了修改,撤銷修改就回到添加到暫存區後的狀態
回到最近一次git commit 或者 git add時 的狀態
//未添加到暫存區
$ git checkout -- a.txt
把a.txt文件在工作區的修改全部撤銷 ( -- 符號很重要,如果沒有,變成了切換到另一個分支的命令了)
//已經添加到暫存區(2步)
$ git reset HEAD a.txt (git reset 既可以回退版本,也可以把暫存區修改回到工作區,用HEAD時,表示最新的版本);
$ git checkout -- a.txt
刪除文件:
一般情況下:
1. $ rm a.txt
2. git status 告訴工作區和版本庫不一致了;
如果要從版本庫當中刪除:
$ git rm a.txt
$ git commit -m "remove a.txt"
誤刪了本地文件,從版本庫裏面恢復:
$ git checkout --a.txt
內容:倉庫,分支的概念
遠程倉庫:
- 添加遠程庫:
$ git remote add origin [email protected]:../leargit.git
遠程庫的名字叫做origin
把本地庫的內容推送到遠程,用 $git push 命令,是把當前分支master推送到遠程;
$ git push -u origin master
-u 會關聯本地master分支和遠程的master分支
接下來提交:
$git push origin master
- 從遠程庫克隆
$ git clone https://........git
$ git clone git://github.com:........git
git 支持多種協議
git:// 使用SSH 這種協議的速度最快;
https:
分支管理
-
創建與合併分支
git 把每次提交都串成一條時間線,時間線就是一個分支,默認一個master主分支.HEAD不是指向提交,而是指向master,所以HEAD指向的就是當前分支。
當我們創建新的分支,比如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。
假如我們在dev工作完成了,可以把dev合併到master上, 合併方式是把master指向dev的當前提交,完成合並;
命令
1.$ git checkout -b dev :創建dev分支,切換到dev分支
相當於以下兩條命令
$git branch dev $ git checkout dev
$git checkout master : 切換回主分支
2. 查看當前分支
$ git branch
3. 合併分支
$git merge dev : 用於合併指定分支到當前分支。
注意合併模式是“快進模式” : Fast-forward ,也就是直接把master 指向 dev 的當前提交;
4. 禁用FF
$git merge --no-ff -m "no ff" dev
5. 刪除分支
合併完了過後,可以刪除 dev分支了
$git branch -d dev
- 解決衝突
git無法自動合併分支時,首先需要解決衝突,再提交,合併完成
$git log --graph : 可以查看分支合併圖
分支策略
master 分支時非常穩定的,僅用來發布新版本,平時不能在上面幹活。幹活都在dev分支上。發佈1.0版本時,再把dev分支合併到master分支發佈1.0版本;
Bug分支:
每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除
git 的stash功能,可以把當前工作現場儲藏起來,等以後恢復現場後繼續工作
1. $git stash : 保存當前的工作到dev分支上面
2. $git checkout master : 準備在master上面修復bug;
$git checkout -b issue: 創建issue分支修復bug;
3. $git add a.txt $git commit -m "fix bug":提交修復的文件
4. 切換到master分支,並完成合並,最後刪除issue分支
$git checkout master
$git merge --no-ff -m "merge bug fix " issue
$ git branch -d issue
5.回到dev幹活:
$git checkout dev
$git status (當前工作區是乾淨的)
$git stash list 查看保存的工作現場
6.恢復之前的工作現場:
第一種: $git stash apply $git stash drop (調用後手動刪除stash內容)
第二種: $git stash pop (自動刪除stash內容)
其他: 可以多次stash,恢復的時候,恢復到指定的stash
$git stash list
$git stash apply stash@{0}
- Feature分支:添加一個新功能時,最好新建一個feature分支,在上面開發,完成後合併,最後刪除feature分支
$git branch -D feature
強行刪除分支feature
多人協作
從遠程克隆時,git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin
$git remote 查看遠程庫的信息
或者 $git remote -v
- 推送分支:
master分支是主分支,要時刻與遠程同步
dev分支是開發分支,也需要同步
bug分支只用於本地修復的bug,沒必要推送到遠程
feature分支取決於是否合作開發
$git push origin master : git把該分支推送到遠程庫對應的遠程分支上
$git push origin dev : 推送其他分支
- 抓取分支
$git pull :從遠程拉取
如需設置本地分支與遠程分支的鏈接,採用
$git branch --set-upstream dev origin/dev
- 多人協作的模式:
- 試圖git push origin branch-name推送自己的修改
- 先用git pull試圖合併
- 如果合併有衝突,解決衝突,本地提交
- 衝突解決後,git push origin branch-name
內容: 標籤管理
- 發佈一個版本時,通常在版本庫打一個標籤。取某個標籤的版本,對應某個時刻的快照。
$git tag v1.0 : 打一個新標籤
$git tag : 查看所有標籤
$git tag v0.9 32323(commit id):給某次的提交打標籤
$git show v0.9 : 查看標籤信息
$git tag -d v0.1 :刪除某個標籤
- 自定義Git
$git config --global color.ui true : git顯示顏色
- 忽略特殊文件
在git工作區的根目錄下創建一個特殊的.gitignore文件,把忽略的文件名填進去,git會自動忽略這些文件;
.gitignore文件本身要放到版本庫裏,並且可以對.gitignore做版本管理
- 配置文件
每個倉庫的Git配置文件都放在.git/config文件中
$cat .git/config
$cat .gitconfig:當前用戶的配置文件