簡單的代碼提交流程
- git status 查看工作區代碼相對於暫存區的差別
- git add . 將當前目錄下修改的所有代碼從工作區添加到暫存區 . 代表當前目錄
- git commit -m ‘注釋’ 將緩存區內容添加到本地倉庫
- git pull origin master先將遠程倉庫master中的信息同步到本地倉庫master中
- git push origin master 將本地版本庫推送到遠程服務器,
origin是遠程主機,master表示是遠程服務器上的master分支和本地分支重名的簡寫,分支名是可以修改的
Git add
git add [參數] <路徑> 作用就是將我們需要提交的代碼從工作區添加到暫存區,就是告訴git系統,我們要提交哪些文件,之后就可以使用git commit命令進行提交了。
為了方便下面都用 . 來標識路徑, . 表示當前目錄,路徑可以修改,下列操作的作用范圍都在版本庫之內。
- git add .
不加參數默認為將修改操作的文件和未跟蹤新添加的文件添加到git系統的暫存區,注意不包括刪除 - git add -u .
-u 表示將已跟蹤文件中的修改和刪除的文件添加到暫存區,不包括新增加的文件,注意這些被刪除的文件被加入到暫存區再被提交並推送到服務器的版本庫之后這個文件就會從git系統中消失了。 - git add -A .
-A 表示將所有的已跟蹤的文件的修改與刪除和新增的未跟蹤的文件都添加到暫存區。
Git commit
git commit 主要是將暫存區里的改動給提交到本地的版本庫。每次使用git commit 命令我們都會在本地版本庫生成一個40位的哈希值,這個哈希值也叫commit-id,
commit-id 在版本回退的時候是非常有用的,它相當於一個快照,可以在未來的任何時候通過與git reset的組合命令回到這里.
- git commit -m ‘message’
-m 參數表示可以直接輸入后面的“message”,如果不加 -m參數,那么是不能直接輸入message的,而是會調用一個編輯器一般是vim來讓你輸入這個message,
message即是我們用來簡要說明這次提交的語句。 - git commit -am ‘message’ -am等同於-a -m
-a參數可以將所有已跟蹤文件中的執行修改或刪除操作的文件都提交到本地倉庫,即使它們沒有經過git add添加到暫存區,
注意: 新加的文件(即沒有被git系統管理的文件)是不能被提交到本地倉庫的。
Git push
在使用git commit命令將修改從暫存區提交到本地版本庫后,只剩下最后一步將本地版本庫的分支推送到遠程服務器上對應的分支了,如果不清楚版本庫的構成,可以查看我的另一篇,git 倉庫的基本結構。
git push的一般形式為 git push <遠程主機名> <本地分支名> <遠程分支名> ,例如 git push origin master:refs/for/master ,即是將本地的master分支推送到遠程主機origin上的對應master分支, origin 是遠程主機名。第一個master是本地分支名,第二個master是遠程分支名。
- git push origin master
如果遠程分支被省略,如上則表示將本地分支推送到與之存在追蹤關系的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建 - git push origin :refs/for/master
如果省略本地分支名,則表示刪除指定的遠程分支,因為這等同於推送一個空的本地分支到遠程分支,等同於 git push origin –delete master - git push origin
如果當前分支與遠程分支存在追蹤關系,則本地分支和遠程分支都可以省略,將當前分支推送到origin主機的對應分支 - git push
如果當前分支只有一個遠程分支,那么主機名都可以省略,形如 git push,可以使用git branch -r ,查看遠程的分支名
關於 refs/for:
refs/for 的意義在於我們提交代碼到服務器之后是需要經過code review 之后才能進行merge的,而refs/heads 不需要
Git pull
1.git pull origin <remote_branch>:<local_branch>
這種用法寫起來最為繁瑣,但最好理解:
場景:當本地的當前分支不是local_branch;
作用:將遠程分支拉取到指定本地分支;
例如:當前分支是dev,但是你想把遠程master”同步”到本地master,但又不想使checkout切換到master分支;
這時你就可以使用git pull origin master:master
1
2
3
4
5
|
zhangchangzhi@ZBXXXX
/
e
/
02.Workspace
-
test
/
gitTest (dev)
$ git pull origin master:master
From https:
/
/
github.com
/
jinxintang
/
gitTest
a09fdc4..
941758f
master
-
> master
Already up
-
to
-
date.
|
從上述代碼可以看到,我當前分支為dev,但執行"同步”操作的卻是在master分支;
2.git pull origin <remote_branch>
有了上面的例子,這種使用方法的場景和作用就好理解了:
場景:在當前分支上進行同步操作;
作用:將指定遠程分支同步到當前本地分支;
1
2
3
4
5
|
zhangchangzhi@ZBXXX
/
e
/
02.Workspace
-
test
/
gitTest (dev)
$ git pull origin master
From https:
/
/
github.com
/
jinxintang
/
gitTest
*
branch master
-
> FETCH_HEAD
Already up
-
to
-
date.
|
把遠程master分支同步到HEAD分支(HEAD分支指向當前位置);
3.git pull
這種寫法最簡單,也最常用,但是隱含的知識也是最多的;
場景:本地分支已經和想要拉取的分支建立了“關聯”關系;
作用:拉取所有遠程分支的新版本"坐標",並同步當前分支的本地代碼(具體根據關聯分支而定)
什么是"關聯"分支?
首先我們先使用git branch -vv
查看一下目前分支的“關聯”情況;
1
2
3
|
$ git branch
-
vv
*
dev
1a1b215
[origin
/
dev] Merge branch
'master'
of https:
/
/
github.com
/
jinxintang
/
gitTest into dev
master a09fdc4 [origin
/
master] create pull
|
那么這種關聯是如何建立、是否可以修改呢;
配置本地分支與遠程分支的三種方法:
1.檢出時建立關聯關系:
git checkout -b dev origin/dev
當我們檢查時,git會自動為我們檢出的分支和遠程分支建立關聯關系;
2.提交時配置關聯關系:
git push -u origin <remote_branch>
或
git push --set-upstream origin <remote_branch>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
zhangchangzhi@ZB
-
PF0SB6DQ MINGW64
/
e
/
02.Workspace
-
test
/
gitTest (dev_zcz)
$ git branch
-
vv
*
dev_zcz
3b7001a
[origin
/
dev] cm
master a09fdc4 [origin
/
master] create pull
zhangchangzhi@ZB
-
PF0SB6DQ MINGW64
/
e
/
02.Workspace
-
test
/
gitTest (dev_zcz)
$ git push
-
u origin dev_zcz
Everything up
-
to
-
date
Branch dev_zcz
set
up to track remote branch dev_zcz
from
origin.
zhangchangzhi@ZB
-
PF0SB6DQ MINGW64
/
e
/
02.Workspace
-
test
/
gitTest (dev_zcz)
$ git branch
-
vv
*
dev_zcz
3b7001a
[origin
/
dev_zcz] cm
master a09fdc4 [origin
/
master] create pull
|
通過上面的例子可以看到push前dev_zcz關聯的是origin/dev,執行push -u 后管理分支改為origin/dev_zcz
注:默認配置下,提交時本地分支需和遠程分支同名