筆記-git-基礎使用
筆記-git-基礎使用
1. git相關概念
- 工作區(Working Directory):
就是在電腦裏能看到的目錄,init後的當前目錄就是一個工作區;
- 版本庫(Repository):
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫裏存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD;
- HEAD表示當前版本,HEAD^表示前一個版本,HEAD^^表示前前版本;
2. GIT客戶端
2.1. 客戶端配置管理
config 配置有system,global(用戶級別) ,local(當前倉庫)三個級別,順序為system-》global-》local,底層配置會覆蓋頂層配置,分別使用--system/global/local 可以定位到配置文件。
常用配置命令:
git config –global user.name “name”
git config –global user.email [email protected]
git config –global core.editor <>
查看配置
git config –list
git config –global –list
git config –system –list
git config –local --list
2.2. 開始——獲取倉庫
1、 創建倉庫
git init
初始化後,目錄下會出現一個名為 .git 的目錄,所有 Git 需要的數據和資源都存放在這個目錄中。
2、 也可以clone
git clone https://github.com/libgit2/libgit2 mylibgit
3. 常用操作
3.1. 創建文件並提交到版本庫
在當前目錄下新增或修改文件後保存到版本庫分為兩步:
- git add將修改添加到暫存區;
- git commit [-m commit explain ] #提交說明不是必需項,但強烈建議每次提交寫說明。
3.2. 查看暫存區
git status
git status –s #使用狀態碼表示文件狀態
狀態碼解釋:
A: 你本地新增的文件(服務器上沒有)
C: 文件的一個新拷貝
D: 你本地刪除的文件(服務器上還在)
M: 文件的內容或者mode被修改了
R: 文件名被修改了
T: 文件的類型被修改了
U: 文件沒有被合並(你需要完成合並才能進行提交)
X: 未知狀態(很可能是遇到git的bug了,你可以向git提交bug report)
?:未被git進行管理,可以使用git add file1把file1添加進git能被git所進行管理
3.3. 查看修改內容
有一個命令用於查看已修改部分:
git diff
git diff filename
這種是比較 工作區和暫存區
比較暫存區與最新本地版本庫
git diff --cached filename
比較工作區和最新版本
git diff HEAD filename
比較工作區與指定的 commit -id 的差異
git diff commit-id filename
比較暫存區與指定 commit-id 的差異
git diff --cached commit-id filename
比較兩個 commit -id 的差異
git diff commit-id commit-id
3.4. 回退
版本回退
git log查看歷史記錄
git reset –hard commit_id回退版本
git reset
git reset –mixed:此為默認方式,不帶任何參數的git reset,即時這種方式,它回退到某個版本,只保留源碼,回退commit和index信息
git reset –-soft:回退到某個版本,只回退了commit的信息,換句話說只修改了HEAD指向,暫存和工作區沒變;
git reset -–hard:徹底回退到某個版本,本地的源碼也會變為上一個版本的內容,撤銷的commit中所包含的更改被沖掉。
回退總結:
- 版本回退:git reset --hard commit_id
- 查看版本號git log,確定回退到哪個版本,HEAD^也是可以的
- git reflog,如果回退版本後後悔了,使用該命令查看命令歷史,再使用reset回到新版本。
3.5. 撤消
- 工作區文件修改撤消:git checkout –file;
- 工作區文件修改後添加到了暫存區,想放棄修改,分兩步:
git reset HEAD <file>
git checkout --file
- 已提交到版本庫後撤消,參考版本回退。
3.6. 刪除文件
一般是在工作區刪除了某個文件,有兩種可能:
- 確實需要刪除,那麽也需要在版本庫中刪除:
git rm filename
git commit
- 誤刪除,需要恢復:
git checkout --filename
3.7. 分支管理
分支裏有一個概念叫指針,head就是指針,指向當前分支,一般是master;
新建分支:
想要新建一個分支並同時切換到那個分支上,你可以運行一個帶有 -b 參數的 git checkout 命令:
$ git checkout -b iss53
Switched to a new branch "iss53"
它是下面兩條命令的簡寫:
$ git branch iss53
$ git checkout iss53
切換回 master 分支了:
$ git checkout master
Switched to branch ‘master‘
修改分支iss53,然後將其合並回 master 分支,可以使用 git merge。
$ git checkout master
$ git merge dev1
可以使用帶 -d 選項的 git branch 命令來刪除分支:
$ git branch -d hotfix
git branch –v
git branch –a
3.8. git merge
git merge有fast-Foward模式和no-ff模式:
- Fast-Forward:當前分支合並到另一分支時,如果沒有分歧,就會直接移動指針;
舉例來說,開發一直在m分支進行,新建一個dev的分支,並在其上提交;
回到m分支,此時m分支在創建dev分支後未進行新的提交。
此時的合並就是fast-forward。
- no-ff模式:--no-ff:不使用fast-forward方式合並,保留分支的commit歷史
git merge --no-ff -m "commit描述" 要合並的分支名
推薦使用no-ff模式,可以留下commit記錄,便於管理。
3.8.1. 沖突
當mater和dev各有新的提交後在合並時會產生沖突。
Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,打開文件後沖突示例內容:
<<<<<<< HEAD
12.merge:change master
=======
11.merge: change branch dev1
>>>>>>> dev1
可以在修改後再add,commit
小結:
當Git無法自動合並分支時,就必須首先解決沖突。解決沖突後,再提交,合並完成。
解決沖突就是把Git合並失敗的文件手動編輯為我們希望的內容,再提交。
用git log --graph命令可以看到分支合並圖。
3.9. 遠程倉庫
3.9.1. 查看信息
git remote
git remote –v
git remote show <name> #查看詳細信息
3.9.2. 添加
git remote add <shortname> <url>
3.9.3. 推送
語法:
git push <遠程主機名> <本地分支名>:<遠程分支名>
以下是一些示例:
$ git push origin master
上面命令表示,將本地的master分支推送到origin主機的master分支。如果master不存在,則會被新建。
如果省略本地分支名,則表示刪除指定的遠程分支,因為這等同於推送一個空的本地分支到遠程分支。
$ git push origin :master
# 等同於
$ git push origin --delete master
上面命令表示刪除origin主機的master分支。如果當前分支與遠程分支之間存在追蹤關系,則本地分支和遠程分支都可以省略。
$ git push origin
上面命令表示,將當前分支推送到origin主機的對應分支。如果當前分支只有一個追蹤分支,那麽主機名都可以省略。
$ git push
如果當前分支與多個主機存在追蹤關系,則可以使用-u選項指定一個默認主機,這樣後面就可以不加任何參數使用git push。
$ git push -u origin master
上面命令將本地的master分支推送到origin主機,同時指定origin為默認主機,後面就可以不加任何參數使用git push了。
3.9.4. fetch
git fetch:Download objects and refs from another repository
從遠程倉庫取回分支和分支信息。如果只想取回特定分支的更新,可以指定分支名。
git fetch <遠程主機名> <分支名>
git fetch origin master
取回來的分支可以可以在本地主機上訪問(即使斷網),有一點不同是在本地主機上"遠程主機名/分支名"的形式讀取。
比如:
git fetch 130
git checkout 130/dev
3.9.5. 拉取
pull:Fetch from and integrate with another repository or a local branch
取回遠程主機分支的更新,再與本地的指定分支合並。
一般情況下這樣使用:
git pull <遠程主機名> <遠程分支名>:<本地分支名>
比如,取回130主機的dev分支,與本地的dev_temp分支合並:
git pull 130 dev:dev_temp
如果遠程分支是與當前分支合並,則冒號後面的部分可以省略。
$ git pull 130 dev
筆記-git-基礎使用