Android進階8:完全瞭解Git使用重要思想和經常使用命令梳理

git倉庫工做原理
git倉庫工做原理

一,建立版本庫的兩種方式

  • 先有本地版本庫,後有遠程庫
    建立一個版本庫很是簡單,首先,選擇一個合適的地方,cd到某個文件夾,建立一個空目錄:
$ mkdir learngit
$ cd learngit
複製代碼

這個是否只是在當前目錄下建立了一個普通的空文件夾
第二步:進入到learngit,使用如下命令,將learngit初始化爲git倉庫html

$ git init
複製代碼

這時,在leargit文件夾就多了一個.git的隱藏文件夾,這就是git倉庫。而且爲當前git倉庫建立了一個本地master分支,本地的commit提交都是提交到此本地matser分支。java

隱藏的.git文件夾
隱藏的.git文件夾
.git文件夾內容
.git文件夾內容

第三步:新建遠程倉庫,設置爲本地倉庫的遠程庫
首先,登錄GitHub,而後,根據安裝git時找到rsa文件,把ssh-key的公鑰添加到GitHub的「Add SSH-Key」.這部分安裝git
而後,在右上角找到「Create a new repo」按鈕,建立一個新的倉庫:git

建立倉庫
建立倉庫

Repository name填入 learngit,其餘保持默認設置,點擊 Create repository按鈕,就成功地建立了一個新的Git倉庫:

建立倉庫
建立倉庫

如今,咱們根據GitHub的提示,在本地的learngit倉庫下運行命令:github

$ git remote add origin git@github.com:tuke0919/learngit.git
複製代碼

遠程庫的名字就是origin這是Git默認的叫法,也能夠改爲別的,可是origin這個名字一看就知道是遠程庫。這樣就把遠程庫的master分支和剛建立本地庫時的本地master分支自動關聯起來。web

查看本地倉庫關聯的遠程倉庫:服務器

$ git remote -v
複製代碼
git remote -v
git remote -v

這時,你就能夠在本地建立文件,修改,並push到遠程倉庫保存。app

  • 先有遠程庫,後有本地版本庫
    如今,咱們須要把現有的project的拉取到本地開發。就須要從遠程克隆.第一步仍是須要新建一個空文件夾做爲本地倉庫,而後cd到該文件夾下克隆項目:
enter description here
enter description here

使用如下命令:

git clone git@github.com:tuke0919/learngit.git
複製代碼

使用clone的方法建立本地庫,git爲咱們完成了至關於git init的工做,把本地倉庫初始化成可git倉庫,而且把本地master分支和clone的遠程分支的master自動關聯起來。yii

git經常使用命令

git命令 說明
git init 初始化本地git倉庫(建立新倉庫)
git config --global user.name "xxx" 配置用戶名
git config --global user.email "xxx@xxx.com" 配置郵件
git status 查看當前版本狀態(是否修改)
git add xyz 添加xyz文件至暫存區
git add . 增長當前子目錄下全部更改過的文件至暫存區
git commit -m 'xxx' 提交
git commit --amend -m 'xxx' 合併上一次提交(用於反覆修改)
git commit -am 'xxx' 將add和commit合爲一步
git branch 顯示本地分支
git branch -a 顯示全部分支
git branch -r 顯示全部遠程分支
git branch --merged 顯示全部已合併到當前分支的分支
git branch --no-merged 顯示全部未合併到當前分支的分支
git branch -d hotfixes/BJVEP933 刪除本地分支hotfixes/BJVEP933
git checkout features/performance 檢出已存在的features/performance分支
it checkout v2.0 檢出版本v2.0
git checkout -b devel origin/develop 從遠程分支develop建立新本地分支devel並檢出
git checkout -b master_copy 從當前分支建立新分支master_copy並檢出
git checkout -b master master_copy 上面的完整版
git merge origin/master 合併遠程master分支至當前分支
git cherry-pick commitId 合併提交commitId的修改
git fetch 獲取全部遠程分支(不更新本地分支,另需merge)
git fetch --prune 獲取全部原創分支並清除服務器上已刪掉的分支
git reset --hard HEAD 將當前版本重置爲HEAD(一般用於merge失敗回退)
git show-branch 圖示當前分支歷史
git show-branch --all 圖示全部分支歷史
git stash 暫存當前修改,將全部至爲HEAD狀態
git stash list 查看全部暫存
git stash pop 將當前stash中的內容彈出,並應用到當前分支對應的工做目錄上
git stash apply 將堆棧中的內容應用到當前目錄,該命令不會將內容從堆棧中刪除
git stash apply stash@{0}
git stash clear 清除堆棧中的全部 內容
git pull origin master 獲取遠程的master分支到當前分支併合並
git pull <遠程主機名> <遠程分支名>:<本地分支名> 取回遠程主機某個分支的更新,再與本地的指定分支合併。
git pull = git fetch + git merge 1,git fetch origin master:brantest 2,git merge brantest
git push <遠程主機名> <本地分支名>:<遠程分支名> 將本地分支的更新,推送到遠程主機
git push origin master 本地的master分支推送到origin主機的master分支。若是master不存在,則會被新建。
git push origin :master 等同於刪除origin主機的master分支
git push origin --delete master 刪除origin主機的master分支

參看鏈接:https://www.yiibai.com/git/git_push.htmlssh

Git Submodule管理項目子模塊

當項目愈來愈龐大以後,不可避免的要拆分紅多個子模塊,咱們但願各個子模塊有獨立的版本管理,而且由專門的人去維護,這時候咱們就要用到git的submodule功能fetch

經常使用命令

git clone <repository> --recursive 遞歸的方式克隆整個項目
git submodule add <repository> <path> 添加子模塊
git submodule init 初始化子模塊
git submodule update 更新子模塊
git submodule foreach git pull 拉取全部子模塊
複製代碼

1. 建立帶子模塊的版本庫

建立project版本庫,並提交readme.txt文件

git init --bare project.git
git clone project.git project1
cd project1
echo "This is a project." > readme.txt
git add .
git commit -m "add readme.txt"
git push origin master
cd ..
複製代碼

2. 建立moduleA版本庫,並提交a.txt文件

git init --bare moduleA.git
git clone moduleA.git moduleA1
cd moduleA1
echo "This is a submodule." > a.txt
git add .
git commit -m "add a.txt"
git push origin master
cd ..
複製代碼

3. 在project項目中引入子模塊moduleA,並提交子模塊信息

cd project1
git submodule add ../moduleA.git moduleA
git status
git diff
git add .
git commit -m "add submodule"
git push origin master
cd ..
複製代碼

使用git status能夠看到多了兩個須要提交的文件,其中.gitmodules指定submodule的主要信息,包括子模塊的路徑和地址信息moduleA指定了子模塊的commit id,使用git diff能夠看到這兩項的內容。這裏須要指出父項目的git並不會記錄submodule的文件變更,它是按照commit id指定submodule的git header,因此 .gitmodules和moduleA 這兩項是須要提交到父項目的遠程倉庫的。

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
    new file:   .gitmodules
    new file:   moduleA
複製代碼

4.克隆帶子模塊的版本庫

  • 方法一,先clone父項目,再初始化submodule,最後更新submodule,初始化只須要作一次,以後每次只須要直接update就能夠了,須要注意submodule默認是不在任何分支上的,它指向父項目存儲的submodule commit id。
git clone project.git project2
cd project2
git submodule init
git submodule update
cd ..
複製代碼
  • 方法二,採用遞歸參數--recursive,須要注意一樣submodule默認是不在任何分支上的,它指向父項目存儲的submodule commit id
git clone project.git project3 --recursive
複製代碼

5.修改子模塊

修改子模塊以後只對子模塊的版本庫產生影響,對父項目的版本庫不會產生任何影響,若是父項目須要用到最新的子模塊代碼,咱們須要更新父項目中submodule commit id,默認的咱們使用git status就能夠看到父項目中submodule commit id已經改變了,咱們只須要再次提交就能夠了。

cd project1/moduleA
git branch
echo "This is a submodule." > b.txt
git add .
git commit -m "add b.txt"
git push origin master
cd ..
git status
git diff
git add .
git commit -m "update submodule add b.txt"
git push origin master
cd ..
複製代碼

6. 更新子模塊
更新子模塊的時候要注意子模塊的分支默認不是master。是一個未命名的本地分支

  • 方法一,先pull父項目,而後執行git submodule update,注意moduleA的分支始終不是master
cd project2
git pull
git submodule update
cd ..
複製代碼
  • 方法二,先進入子模塊,而後切換到須要的分支,這裏是master分支,而後對子模塊pull,這種方法會改變子模塊的分支。
cd project3/moduleA
git checkout master
cd ..
git submodule foreach git pull
cd ..
複製代碼
相關文章
相關標籤/搜索