1. 程式人生 > >Git遠程操作

Git遠程操作

work log pre 重命名 origin ext ID pull 全部

技術分享圖片

1 git clone

1.1 克隆遠程庫

# https協議
git clone https://github.com/yysue/test.git

# ssh協議 推薦這種
git clone [email protected]:yysue/test.git

克隆時,指定遠程主機名

git clone -o test [email protected]:yysue/test.git
# -o 指定遠程主機名,默認是origin

2 git remote

2.1 列出所有遠程主機

git remote -v
# -v顯示遠程主機的網址
# origin [email protected]:yysue/test.git 表示遠程主機及它的網址

技術分享圖片

2.2 查看主機詳細信息

# 查看主機詳細信息
git remote show origin

技術分享圖片

2.3 添加遠程主機

# 添加遠程主機,註意這裏的url是gitee.com
git remote add for_rm [email protected]:yysue/test.git
git remote add for_rename [email protected]:yysue/test.git

# 添加之後,查看一下遠程主機
git remote -v

技術分享圖片

2.4 刪除,重命名遠程主機

# 刪除遠程主機
git remote rm for_rm

# 重命名遠程主機
git remote rename for_rename gitee_origin

# 修改之後,查看一下遠程主機
git remote -v

技術分享圖片

3 git fetch

3.1 將遠程主機的更新取回本地

git fetch <遠程主機名> <分支名> 
# 取回特定分支需要指定分支名
# 將某個遠程主機的更新全部取回本地

git fetch <遠程主機名> 
# 默認取回所有分支的更新

git fetch
# 默認取回origin主機的所有分支

3.2 查看遠程分支

git branch -r
# -r查看遠程分支
# 在本地主機上要用"遠程主機名/分支名"的形式表示遠程分支,如origin/master

技術分享圖片

3.3 查看所有分支

git branch -a
# -a查看所有分支
# 本地主機的當前分支是master,遠程分支是origin/master

技術分享圖片

3.4 以某分支為基礎,創建新分支

git checkout -b dev origin/master
# 以遠程主機origin上的master分支為基礎創建分支dev並切換到分支dev

4 git pull

4.1 合並分支

git pull <遠程主機名> <遠程分支名>:<本地分支名>
# 這是完整格式 取回遠程主機的某個分支的更新,再與本地的指定分支合並

git pull origin next
# 省略<本地分支名>表示與當前分支合並
# 取回origin/next分支,再與當前分支合並
# 等同於如下兩個操作
git fetch origin
git merge origin/master

git pull origin
# 如果當前分支與遠程分支存在追蹤關系,git pull就可以省略遠程分支名
# 本地的當前分支自動與對應的origin主機進行合追蹤分支(remote-tracking branch)進行合並

git pull
# 如果當前分支只有一個追蹤分支,連遠程主機名都可以省略
# 當前分支自動與唯一一個追蹤分支進行合並
# 默認git pull <===> git pull origin master:master
# 默認遠程主機為origin,遠程分支為master,本地分支為master

git pull --rebase
# 等同於如下兩個操作
git fetch origin
git rebase origin/master

4.2 追蹤關系

在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關系(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關系,也就是說,本地的master分支自動追蹤origin/master分支。

手動建立追蹤關系

git branch --set-upstream master origin/next
# 指定master分支追蹤origin/next分支

4.3 本地同步刪除分支

如果遠程主機刪除了某個分支,默認情況下,git pull不會在拉取遠程分支的時候,刪除對應的本地分支。這是為了防止,由於其他人操作了遠程主機,導致git pull不知不覺刪除了本地分支

git pull -p
# -p 在本地刪除遠程已經刪除的分支
# 等同於下面的命令
git fetch --prune origin
git fetch -p

4.4 git merge

假設初始的分支情況如下圖:

技術分享圖片

# A在mywork上的操作
git checkout -b mywork origin
echo 'a' >> a.txt
git commit -am 'update a.txt'
echo 'b' >> b.txt
git commit -am 'update b.txt'

# B在origin/master上的操作
echo 'c' >> c.txt
git commit -am 'update c.txt'
echo 'd' >> d.txt
git commit -am 'update d.txt'
git push

技術分享圖片

下面來區分git mergegit rebase的區別

在這裏,你可以用"pull"命令把"origin"分支上的修改拉下來並且和你的修改合並; 結果看起來就像一個新的"合並的提交"(merge commit):

# A在mywork上操作
git pull

技術分享圖片

4.5 git rebase

但是,如果你想讓"mywork"分支歷史看起來像沒有經過任何合並一樣,你也許可以用 git rebase:

git checkout mywork
git rebase origin

這些命令會把你的"mywork"分支裏的每個提交(commit)取消掉,並且把它們臨時 保存為補丁(patch)(這些補丁放到".git/rebase"目錄中),然後把"mywork"分支更新 為最新的"origin"分支,最後把保存的這些補丁應用到"mywork"分支上。

當‘mywork‘分支更新之後,它會指向這些新創建的提交(commit),而那些老的提交會被丟棄。 如果運行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除. (請查看 git gc)

技術分享圖片

技術分享圖片

5 git push

5.1 將本地的更新推送到遠程主機

git push <遠程主機名> <本地分支名>:<遠程分支名>
# 分支推送順序寫法是<來源地>:<目的地>
# git pull <遠程分支>:<本地分支>
# git push <本地分支>:<遠程分支>

git push origin master
# 省略<遠程分支名>
# 將本地的master分支推送到origin主機的master分支,如果後者不存在,則會被新建

git push origin :master
# 省略<本地分支名>
# 表示刪除指定的遠程分支,因為這等同於推送一個空的本地分支到遠程分支
# 等同於下面的命令,刪除origin主機的master分支
git push origin --delete master

git push origin
# 如果當前分支與遠程分支存在追蹤關系,則<本地分支名>和<遠程分支名>都可省略
# 將當前分支推送到origin主機的對應分支

git push
# 當前分支只有一個追蹤分支,主機名也可以省略

git push -u origin master
# 如果當前分支與多個主機存在追蹤關系,則可以使用-u選項指定一個默認主機,
# 這樣後面就可以不加任何參數使用git push

5.2 push默認模式

不帶任何參數的git push,默認只推送當前分支,這叫做simple方式。此外,還有一種matching方式,會推送所有有對應的遠程分支的本地分支。Git 2.0版本之前,默認采用matching方法,現在改為默認采用simple方式。如果要修改這個設置,可以采用git config命令。

git config --global push.default matching
# 或者
git config --global push.default simple

5.3 推送所有本地分支

不管是否存在對應的遠程分支,將本地的所有分支推送到遠程主機,這時需要使用--all選項。

git push --all
# 將所有本地分支推送到遠程主機

5.4 強制覆蓋遠程版本

如果遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地做git pull合並差異,然後再推送到遠程主機。這時,如果你一定要推送,可以使用--force選項。

git push --force
# 本地版本覆蓋遠程版本,即使遠程版本比本地版本新

5.5 推送標簽

git push --tags
# --tags推送標簽(tag),默認不推送

參考

  • Git遠程操作詳解

  • git merge 和 git rebase 小結

Git遠程操作