1. 程式人生 > >筆記-git-基礎使用

筆記-git-基礎使用

解決 editor https delete reset 也會 指針 打開 某個文件

筆記-git-基礎使用

1. git相關概念

  1. 工作區(Working Directory):

就是在電腦裏能看到的目錄,init後的當前目錄就是一個工作區;

  1. 版本庫(Repository):

工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

Git的版本庫裏存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD;

  1. 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. 創建文件並提交到版本庫

在當前目錄下新增或修改文件後保存到版本庫分為兩步:

  1. git add將修改添加到暫存區;
  2. 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中所包含的更改被沖掉。

回退總結:

  1. 版本回退:git reset --hard commit_id
  2. 查看版本號git log,確定回退到哪個版本,HEAD^也是可以的
  3. git reflog,如果回退版本後後悔了,使用該命令查看命令歷史,再使用reset回到新版本。

3.5. 撤消

  1. 工作區文件修改撤消:git checkout –file;
  2. 工作區文件修改後添加到了暫存區,想放棄修改,分兩步:

git reset HEAD <file>

git checkout --file

  1. 已提交到版本庫後撤消,參考版本回退。

3.6. 刪除文件

一般是在工作區刪除了某個文件,有兩種可能:

  1. 確實需要刪除,那麽也需要在版本庫中刪除:

git rm filename

git commit

  1. 誤刪除,需要恢復:

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模式:

  1. Fast-Forward:當前分支合並到另一分支時,如果沒有分歧,就會直接移動指針;

舉例來說,開發一直在m分支進行,新建一個dev的分支,並在其上提交;

回到m分支,此時m分支在創建dev分支後未進行新的提交。

此時的合並就是fast-forward。

  1. 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-基礎使用