Git遠程操作
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 merge
與git 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遠程操作