1. 程式人生 > >mzy git學習,git推送到遠端庫(八)

mzy git學習,git推送到遠端庫(八)

git在同步到遠端庫

關於git中多個使用者切換的事情:

完全使用賬戶密碼策略連線遠端庫:

  • 之前一直嘗試在本地切換多個使用者,發現一直不行,很奇怪?後面發現必須要去win10的憑據管理器刪除當前git的憑據。
    以上是輸入賬戶密碼,進行憑據校驗的情況;

完全使用ssh免登陸策略進行遠端庫連線:

  • 如果是要通過ssh方式登陸的話,建議還是不要多使用者切換了,因為ssh方式免登陸校驗的話,每次都要去生成新的ssh金鑰去切換,著實太過於麻煩了。

配合賬戶密碼策略和ssh兩種策略管理兩個賬戶:

之前還想過,一個使用者使用ssh策略,一個使用者採取賬號密碼策略?沒有試過,覺得應該可行?


好的,我剛剛去試了一下,這種方式可行,一個賬戶使用,賬戶密碼策略;一個賬戶使用ssh免登陸驗證。這樣可以不用每次修改,就可以同時在本地使用兩個賬戶!

把本地庫推送(備份)到遠端庫上:

這裡說的推送到遠端庫上的步驟都是針對一開始遠端庫是空的的操作,並不是在遠端庫已經有分支,把本地庫和遠端庫進行關聯!如果要進行關聯的話,請檢視這篇文章

場景:

在多人協同工作,或者我們把程式碼託管到第三方平臺上的時候,我們要把本地庫和遠端倉庫對應起來。
其實遠端庫和本地庫性質上一模一樣,就是一個為了更方便的備份而已!
我們在單機上跑了這麼久的git,終於上網啦!

在本地新增遠端庫

首先在碼雲上建一個工程,然後在裡面複製遠端倉庫地址:

在這裡插入圖片描述

從上面的圖片中可以看出,有兩種協議的倉庫地址可以選:
一種就是上面說了的https的,一種就是git自己的協議(通過ssh免登陸驗證)。

如果要使用ssh登陸:

# 先使用此命令:
ssh -keygen -t rsa -C "郵箱"
ssh-keygen -t rsa -C "[email protected]" 

生成金鑰之後,把公鑰複製到自己的碼雲或者github上,然後省略…

新增遠端庫對映

# 為當前倉庫新增一個遠端庫:git remote add [倉庫名] [地址]
git remote add origin https://gitee.com/yaoguai1998/LearnGit.git
# 預設的倉庫名是origin,當然你可以根據倉庫特徵自己取名。
# 上面是https協議的,這種是通過郵箱密碼驗證的。

這裡就引入了git的remote命令了:

下面簡單介紹一下remote的相關命令,及一些常用的引數

提醒以下的$符是linux的命令列開始符,不是命令內容
以下遇到origin我們都預設為遠端庫名,master都預設是主分支名,dev次分支名


# 1.增加
# 新增遠端庫 git remote add [origin] [url]
# 為當前倉庫新增一個遠端庫:git remote add [倉庫名] [地址]
$ git remote add origin https://gitee.com/yaoguai1998/LearnGit.git


# 2.刪除
# 刪除一個遠端庫的地址及連線 git remote rm [origin]
$ git remote rm origin


# 3.檢視 
# 檢視當前本地庫中添加了幾個遠端庫和名字
$ git remote
learn
origin 

# 檢視當前的本地庫中的遠端庫的名字,和push(推送),fetch(抓取)地址
$ git remote -v
learn   [email protected]:yaoguai1998/LearnGit.git (fetch)
learn   [email protected]:yaoguai1998/LearnGit.git (push)
origin  https://gitee.com/yaoguai1998/LearnGit.git (fetch)
origin  https://gitee.com/yaoguai1998/LearnGit.git (push)


## 4.修改url
# git remote set-url [origin] [url] 
$ git remote set-url origin [email protected]:yaoguai1998/LearnGit.git

# 以上只是remote的常用引數
# 以下為推薦使用:
 git remote [-v | --verbose]
   or: git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url>
   or: git remote rename <old> <new>
   or: git remote remove <name>
   or: git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
   or: git remote [-v | --verbose] show [-n] <name>
   or: git remote prune [-n | --dry-run] <name>
   or: git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
   or: git remote set-branches [--add] <name> <branch>...
   or: git remote get-url [--push] [--all] <name>
   or: git remote set-url [--push] <name> <newurl> [<oldurl>]
   or: git remote set-url --add <name> <newurl>
   or: git remote set-url --delete <name> <url>

    -v, --verbose         be verbose; must be placed before a subcommand

推送到遠端庫

# git push [倉庫名] [分支名]
# 這裡的意思是推送主分支,master分支,origin也是預設的倉庫名
$ git push origin master

# 也可以這樣,意思是倉庫名和分支名不是絕對的
# 把 dev分支,推送到倉庫地址對映名為gitlearn的遠端倉庫上
$ git push gitlearn dev

# 第一次推送到遠端庫的master上,我們建議是加上 -u 引數的
# 加上-u引數,如果遠端庫不存在此分支的話,就會建立此分支
$ git push -u origin master

# 有時候在碼雲上初始了遠端庫,其中的master分支已經初始化好了,所以可能要導致此時無法push上
# 在這種第一次推送,並且倉庫是幾乎空白的情況下,無法推送的話,我們可以加上--force引數
$ git push --force origin master

從遠端庫上拉取

git clone

#  git clone [url]
# 克隆有三個效果:
#   1.完整下載遠端庫
#   2.建立本地庫並設定別名:origin (並繫結地址)
#   3.初始化本地庫:(.git目錄)
# 所以建議,如果我們是初始化本地庫的話,不要使用pull命令
# 直接使用clone命令,省去了很多麻煩
$ git clone https://gitee.com/yaoguai1998/LearnGit.git

git fetch
# 把遠端庫上的master分支的內容抓取到本地
git fetch origin master

因為fetch只是把內容從遠端庫中抓取下來,還沒有做合併的動作(merge),所以在fetch之後,vim本地檔案,是看不到修改的。
只有通過:git checkout origin/master操作(git checkout 本地庫名稱/分支名稱),才能切換到fetch下來的分支中去,然後才能看到修改
(我猜想這個是切換到版本庫中master中的,因為我們的內容被fetch下來之後應該放到本地庫中)
如果要切換回去的話,要通過git checkout master 我覺得這個是切換到工區中的master中,那麼其實區別就出來了!

# 切換到本地庫中的分支的話:git checkout 版本庫名字/分支名字
$ git checkout origin/master
# 切換到工作區中的分支的話:git checkout 分支名稱
$ git checkout master

通過fetch操作,只是將遠端庫中的內容拉取到了本地,但是其實還沒有和本地的內容進行合併:其實通過 [遠端庫名/分支名] 的形式,就是表明是遠端庫的分支(後面我們操作遠端庫和本地庫的分支建立追蹤關係時,遠端庫的名字就是這樣表示的)。

建立分支與分支之間的追蹤關係

上面說到遠端庫和本地庫的分支之間建立追蹤關係,這裡就順便說明一 下,什麼是追蹤關係:

在我們上面進行push、fetch以及後面的pull等等和遠端庫進行互動的操作的時候,我們都會加上分支名稱:例如git push origin master、git fetch learngit dev等等,這樣每次都需要寫後面的分支名稱和遠端倉庫名稱,但是我們很多時候就是想推送我們當前所處的分支,遠端庫其實也就是固定的那一個或者兩個,所以追蹤關係就是為了解決這樣一點的,如果我們建立的本地分支和遠端庫的分支的追蹤關係的話,那麼當我們push、pull的時候,就可以省略分支名稱,預設就是當前分支和設定的遠端分支進行推送和拉取!

如果不建立追蹤關係直接:git push的話

# 直接就失敗了
$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

檢視本地庫的分支和遠端庫的分支的對映關係: git branch -vv

# 檢視本地庫的分支和遠端庫的分支的對映關係: branch -vv
$ git branch -vv
  dev    d62c9e1 dev 上提交readme.txt
  issue  a278fe9 issue中修改了LICENSE
* master 434cab2 解決衝突

# 發現以上的分支和遠端庫的分支的都沒有建立追蹤關係
# 這裡嘗試給issue和遠端庫的origin/issue建立追蹤關係
# 首先切換到issue分支
$ git checkout issue
Switched to branch 'issue'

# 通過兩種方式建立本地分支和遠端分支的追蹤關係
# 1.git branch -u [倉庫名]/[分支名]
# 2.git branch --set-upstream-to [倉庫名]/[分支名]
$ git branch -u origin/issue
Branch 'issue' set up to track remote branch 'issue' from 'origin'.

# 再通過:git branch -vv 檢視追蹤關係,發現issue已經有了
$ git branch -vv
  dev    d62c9e1 dev 上提交readme.txt
  issue  f3528d7 [origin/issue] 在issue中修改了LICENSE
  master 434cab2 解決衝突
* mzy    f3528d7 在issue中修改了LICENSE

# 修改檔案之後,git commit 之後,直接git push 發現追蹤關係已經生效
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by Gitee.com
To gitee.com:yaoguai1998/LearnGit.git
   f3528d7..39a6ce1  issue -> issue

# 切斷掉聯絡:git branch --unset-upstream  
$ git branch --unset-upstream
# 通過git branch -vv 發現追蹤關係已經不存在了!
$ git branch -vv
  dev    d62c9e1 dev 上提交readme.txt
* issue  39a6ce1 修改了LICENSE
  master 25478c7 修改了readme.txt
  mzy    f3528d7 在issue中修改了LICENSE
git merge

回到正題:
前面我們說fetch只能抓取到本地庫中,但是並沒有在我們的工作區中體現,所以我們要手動進行一個本地庫和我們工作區中的分支進行merge的操作!

# 首先切換回我們的master分支
$ git checkout master

# 首先把遠端庫中的東西拉取下來
$ git fetch origin/master
# 現在我們去合併版本庫中的master:
$ git merge origin/master

以上這樣才完成了本地庫和遠端庫的合併

git pull

pull,其實就是fetch和merge的合併操作,一個pull其實就是把fetch和merge全都做了,如果你的程式不復雜,並且協同不那麼麻煩,最好還是使用pull操作,來簡化你的繁瑣的過程。

# 首先把遠端庫中的東西拉取下來
$ git fetch origin/master
# 現在我們去合併版本庫中的master:
$ git merge origin/master

# 等同

# git pull [倉庫名] [分支名]
$ git pull origin master
# 如果使用了追蹤的話,我們在當前分支上就可以直接
$ git pull