$ mkdir learngit
$ cd learngit
複製代碼
這個是否只是在當前目錄下建立了一個普通的空文件夾
。
第二步:進入到learngit,使用如下命令,將learngit初始化爲git倉庫html
$ git init
複製代碼
這時,在leargit文件夾就多了一個.git
的隱藏文件夾,這就是git倉庫。而且爲當前git倉庫建立了一個本地master分支,本地的commit提交都是提交到此本地matser分支。java
第三步:新建遠程倉庫,設置爲本地倉庫的遠程庫
首先,登錄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
複製代碼
這時,你就能夠在本地建立文件,修改,並push到遠程倉庫保存。app
git clone git@github.com:tuke0919/learngit.git
複製代碼
使用clone的方法建立本地庫,git爲咱們完成了至關於git init的工做,把本地倉庫初始化成可git倉庫,而且把本地master分支和clone的遠程分支的master自動關聯起來。yii
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功能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.克隆帶子模塊的版本庫
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。是一個未命名的本地分支
git submodule update
,注意moduleA的分支始終不是mastercd project2
git pull
git submodule update
cd ..
複製代碼
cd project3/moduleA
git checkout master
cd ..
git submodule foreach git pull
cd ..
複製代碼