資料整理
筆記 摘自上面的資料#
Git 基礎(chǔ)知識(shí)
Git 數(shù)據(jù)的可靠性是靠文件的校驗(yàn)和做到的狭握。
Git 三種狀態(tài): 已提交( committed ) 阴绢、已修改(modified)、已暫存(staged)。
已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫中
Git管理版本差異,并不是像其它系統(tǒng)那樣保存一組基本文件和每個(gè)文件雖時(shí)間逐步基類的差異拂共,而是采用快照的形式紊馏。Git在你提交更新或保存項(xiàng)目狀態(tài)時(shí)料饥,對(duì)當(dāng)時(shí)全部文件制作一個(gè)快照并保存這個(gè)快照的索引。如果文件沒有修改朱监,Git不再重新存儲(chǔ)該文件岸啡,而是只保留一個(gè)鏈接,來指向之前存儲(chǔ)的文件赫编。
Git 基礎(chǔ)操作
概念: 倉儲(chǔ)(repertory), 跟蹤(track), 暫存(stage), 提交(commit), 推送(push), 拉取(pull)
獲取Git倉庫
- 在工程目錄初始化 Git 倉庫:
$ git init
- 追蹤工程文件,并提交:
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
- 上傳到GitHub
$ git remote add origin https://github.com/chlq/javaStudy.git
$ ##git remote set-url origin https://github.com/chlq/javaStudy.git
$ git push origin
- 克隆現(xiàn)有的倉庫
當(dāng)你執(zhí)行 git clone 命令的時(shí)候巡蘸,默認(rèn)配置下遠(yuǎn)程 Git 倉庫中的每一個(gè)文件的每一個(gè)版本都將被拉取下來.
克隆倉庫的命令格式為
$ git clone [url]
$ git clone https://github.com/chlq/XChart
$ $ git clone https://github.com/chlq/XChart myXChart
這會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)名為 “XChart” 的目錄,并在這個(gè)目錄下初始化一個(gè) .git 文件夾
而第二個(gè)名字會(huì)創(chuàng)建 名字為 'myXChart' 的目錄
更新到倉庫
- 檢查當(dāng)前文件狀態(tài)
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致沛慢。
無文件要提交赡若,干凈的工作區(qū)
$ echo 'study how to use git' > studyGit
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致。
未跟蹤的文件:
(使用 "git add <文件>..." 以包含要提交的內(nèi)容)
studyGit
提交為空团甲,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)
未跟蹤(untracked) 意味著 倉庫之前的快照中沒有這個(gè)文件;Git也不會(huì)自動(dòng)降至納入跟蹤范圍,說白了就是在倉庫中是黑戶,未登記.雖然冷凍室里偶爾會(huì)有老鼠, 但是食物登記上可沒有, 管理系統(tǒng)(Git)也不會(huì)主動(dòng)添加上來
- 跟蹤新文件
$ git add studyGit
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致。
要提交的變更:
(使用 "git reset HEAD <文件>..." 以取消暫存)
新文件: studyGit
這時(shí)該文件處于 暫存狀態(tài)( staged); 另外 git add 以目錄為參數(shù),則會(huì)遞歸跟蹤該目錄下的所有文件.
- 暫存已修改文件
$ echo 'test' >> CONTRIBUTORS
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致黍聂。
要提交的變更:
(使用 "git reset HEAD <文件>..." 以取消暫存)
新文件: studyGit
尚未暫存以備提交的變更:
(使用 "git add <文件>..." 更新要提交的內(nèi)容)
(使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng))
修改: CONTRIBUTORS
$ git add CONTRIBUTORS
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致躺苦。
要提交的變更:
(使用 "git reset HEAD <文件>..." 以取消暫存)
修改: CONTRIBUTORS
新文件: studyGit
git add 應(yīng)當(dāng)利皆為“添加內(nèi)容到下一次提交中”而不是“將一個(gè)文件添加到項(xiàng)目中”. 另外 提交時(shí)只提交暫存區(qū)里的變更,已更改但未暫存的不會(huì)提交.
- 其他
$ git status -s ## 簡略信息
M CONTRIBUTORS
A studyGit
$ cat .gitignore ## 忽略的文件, 正則表達(dá)式
$ git diff
- 提交更新
$ git commit
$ git commit -m "This is a git commit test."
$ git commit -a -m "can commit all file that tracked"
Git - 分支
每次提交對(duì)象會(huì)包含一個(gè)指向上次提交對(duì)象(父對(duì)象)的指針,提交的信息产还,作者及郵箱等匹厘。
分支其實(shí)就是指向其中一個(gè)對(duì)象的指針。
$ git branch testing ##在當(dāng)前所在的提交對(duì)象上創(chuàng)建一個(gè)testing分支指向該對(duì)象脐区。
##一直指向當(dāng)前所在提交對(duì)象的指針叫 HEAD
$ git log --oneline --decorate ## 查看個(gè)分支當(dāng)前的對(duì)象
$ git checkout testing ## 這樣當(dāng)前分支HEAD就切換到testing分支了
$ git log --oneline --decorate
d62d657 (HEAD, origin/develop, origin/HEAD, develop) study git commit you can de
$ touch gittestfile
$ echo "git testing branch" >> gittestfile
$ git add gittestfile
$ git commit -a -m 'branch testing'
[testing e077c17] branch testing
2 files changed, 2 insertions(+)
create mode 100644 gittestfile
$ git log --oneline --decorate
e077c17 (HEAD, testing) branch testing
d62d657 (origin/develop, origin/HEAD, develop) study git commit you can deal it
$ git checkout -b iss53
## 與下面兩條等效
$ git branch iss53
$ git checkout iss53
# git branch -d testing ##刪除分支testing
本地分支合并
想要將分支iss53合并到master分支上
$git checkout master
$git merge iss53
$git branch -d iss53
遠(yuǎn)程分支
阮一峰的網(wǎng)絡(luò)日志-Git遠(yuǎn)程操作詳解
阮一峰老師的日志寫的非常條理清晰易懂
遠(yuǎn)程分支(remote branch)是對(duì)遠(yuǎn)程倉庫中的分支的索引愈诚。遠(yuǎn)程分支本地可以查看但是無法移動(dòng),只有在進(jìn)行網(wǎng)絡(luò)交互時(shí)才會(huì)更新。
當(dāng)你git clone 遠(yuǎn)端Git服務(wù)器里的代碼時(shí)炕柔,Git自動(dòng)將此遠(yuǎn)程倉庫命名為origin, 并建立一個(gè)指向該倉庫master分支的指針: origin/master
# 設(shè)置遠(yuǎn)程倉庫名
$ git clone -o 希望的倉庫名 遠(yuǎn)程git URL
# 通過 git branch 可以查看當(dāng)前本地分支
? git:(chlq_cases) ? git branch
* chlq_cases
master
# 通過 git branch -r 查看遠(yuǎn)程分支
? git:(chlq_cases) ? git branch -r
origin/HEAD -> origin/master
origin/chlq_cases
origin/dev
origin/master
# 從遠(yuǎn)程分支創(chuàng)建新的本地分支
git checkout -b newBrach origin/master
# 與本地分支合并類似
git merge origin/master # 可以在當(dāng)前本地分支上酌泰,合并origin/master
# 刪除遠(yuǎn)程分支
git branch -r
git branch -r -d origin/xxxx
git remote
$ git remote -v
origin ssh://git@git.xxx.com/~chenlanqiang/waimai-money-app-uitest.git (fetch)
origin ssh://git@git.xxx.com/~chenlanqiang/waimai-money-app-uitest.git (push)
$ git remote set-url origin ssh://git@git.xxx.com/~chenlanqiang/waimai_m_app_uitest_money.git
$ git remote -v
origin ssh://git@git.sankuai.com/~chenlanqiang/waimai_m_app_uitest_money.git (fetch)
origin ssh://git@git.sankuai.com/~chenlanqiang/waimai_m_app_uitest_money.git (push)
git fetch
git fetch命令用于從另一個(gè)存儲(chǔ)庫下載對(duì)象和引用。
git refspec 詳解
# 同步 遠(yuǎn)程倉庫 中的數(shù)據(jù) 到 本地
$ git fetch <遠(yuǎn)程倉庫名>
# 同步 遠(yuǎn)程倉庫 制定分支 的數(shù)據(jù) 到 本地
$ git fetch <遠(yuǎn)程倉庫名> <分支名>
# 同步 遠(yuǎn)程倉庫origin 的master分支 的數(shù)據(jù) 到 本地 origin/master 里
$git fetch origin master
# git fetch <refspec>
# Refspec 的格式是一個(gè)可選的 + 號(hào)匕累,接著是 <src>:<dst> 的格式陵刹,這里 <src> 是遠(yuǎn)端上的引用格式, <dst> 是將要記錄在本地的引用格式欢嘿∷ニ觯可選的 + 號(hào)告訴 Git 在即使不能快速演進(jìn)的情況下,也去強(qiáng)制更新它炼蹦。
# +refs/heads/*:refs/remotes/origin/*
git fetch --tags --process ssh://git@git.remote.com/xxx.git +refs/<tag, like heads>/<tag>:refs/remotes/origin/<tag>
git pull
與fetch 不同的是羡宙, git pull 可以指定要更新的本地分支(可以理解為不同代碼版本的指針)
git pull 相當(dāng)于 git fetch + git merge
$ git pull <遠(yuǎn)程倉庫> < 遠(yuǎn)程分支>:<本地分支>
$ git pull origin master:chlq_cases
# 取回遠(yuǎn)程origin倉庫的master分支, 與本地chlq_cases分支合并
# 不加 本地分支掐隐, 則默認(rèn)合并當(dāng)前分支
$ git pull origin master # 等效于下面的兩句
$ git fetch origin
$ git merge origin/master
git push
git push 命令用于將本地分支的更新狗热,推送到遠(yuǎn)程倉庫
$ git push <遠(yuǎn)程倉庫> <本地分支>:<遠(yuǎn)程分支>
# 如果省略 遠(yuǎn)程分支名 默認(rèn)推送到與本地分支有 追蹤關(guān)系的遠(yuǎn)程分支
$ git push origin master
# 省略本地分支, 表示 刪除指定的遠(yuǎn)程分支
$ git push origin :master
# 等同于
$ git push origin --delete master
git tag
git tag 可以將分支上某個(gè)時(shí)間點(diǎn)的代碼打上標(biāo)簽瑟枫,方便代碼版本管理斗搞、代碼回滾等
$##打標(biāo)簽
$git tag -a your-tag-name -m "msg"
$##同步到遠(yuǎn)端倉庫
$git push origin your-tag-name
$##列出說有tag
$git tag -l
追蹤
fork 及 上傳到upstream
撤銷操作
對(duì)commited的文件
$ git reset HEAD <file>...
對(duì)added的文件
$ git checkout -- <file>...
git stash
##簡單實(shí)用
git stash
...
git stash pop
##更復(fù)雜點(diǎn)
git stash save "work in progress for foo feature"
##查看未提交的GIT棧
git stash list
##選擇第幾個(gè)棧
git stash apply stash@{1}
查看log
man git-log
# 查看提交記錄
git log
# 查看文件變更
git log --stat
commit dff06bc5535f40c0cbe4df905f69eec4418a056b
Author:
Date: Wed Jun 28 22:15:01 2017 +0800
modify serve host ip and add some cases
.../TestNotifyPayInfo.java | 84 ++++++--------
.../TestGetSettleBillOrderVoList4PC.java | 53 +++++++++
.../TestGetSettleMockAccountFlows.java | 124 +++++++++++++++++++++
.../TestQueryAllAccountInfo.java | 65 +++++++++++
src/test/resources-beta/conf/server.properties | 2 +-
src/test/resources-test/conf/server.properties | 2 +-
6 files changed, 277 insertions(+), 53 deletions(-)
#查看指定commit, 可以看到文件變更,內(nèi)容更改
git show $commitCode
#以作者或提交人查看
git log -p --author=chlq
git log -p --commitor=chlq
#以時(shí)間查看
git log -p --since="2017-06-27" --until="2017-06-28" --author=chlq
回退
#回退命令:
$ git reset --hard HEAD^ #回退到上個(gè)版本
$ git reset --hard HEAD~3 #回退到前3次提交之前慷妙,以此類推僻焚,回退到n次提交之前
$ git reset --hard commit_id #退到/進(jìn)到 指定commit的sha碼
#強(qiáng)推到遠(yuǎn)程:
$ git push origin HEAD --force