Git

資料整理

  1. 廖雪峰 JavaScript Python Git 教程
  2. git官方文檔

筆記 摘自上面的資料#

Git 基礎(chǔ)知識(shí)

Git 數(shù)據(jù)的可靠性是靠文件的校驗(yàn)和做到的。
Git 三種狀態(tài): 已提交( committed ) 、已修改(modified)、已暫存(staged)。
已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫(kù)中


工作目錄、暫存區(qū)域以及 Git 倉(cāng)庫(kù)

Git管理版本差異,并不是像其它系統(tǒng)那樣保存一組基本文件和每個(gè)文件雖時(shí)間逐步基類的差異,而是采用快照的形式。Git在你提交更新或保存項(xiàng)目狀態(tài)時(shí),對(duì)當(dāng)時(shí)全部文件制作一個(gè)快照并保存這個(gè)快照的索引。如果文件沒有修改,Git不再重新存儲(chǔ)該文件,而是只保留一個(gè)鏈接,來(lái)指向之前存儲(chǔ)的文件。

Git 基礎(chǔ)操作

概念: 倉(cāng)儲(chǔ)(repertory), 跟蹤(track), 暫存(stage), 提交(commit), 推送(push), 拉取(pull)

獲取Git倉(cāng)庫(kù)

  1. 在工程目錄初始化 Git 倉(cāng)庫(kù):
$ git init
  1. 追蹤工程文件,并提交:
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
  1. 上傳到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
  1. 克隆現(xiàn)有的倉(cāng)庫(kù)
    當(dāng)你執(zhí)行 git clone 命令的時(shí)候,默認(rèn)配置下遠(yuǎn)程 Git 倉(cāng)庫(kù)中的每一個(gè)文件的每一個(gè)版本都將被拉取下來(lái).
    克隆倉(cāng)庫(kù)的命令格式為
$ 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' 的目錄

更新到倉(cāng)庫(kù)

  1. 檢查當(dāng)前文件狀態(tài)
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致。
無(wú)文件要提交,干凈的工作區(qū)
$ echo 'study how to use git' > studyGit
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致。
未跟蹤的文件:
 (使用 "git add <文件>..." 以包含要提交的內(nèi)容)
   studyGit
提交為空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)

未跟蹤(untracked) 意味著 倉(cāng)庫(kù)之前的快照中沒有這個(gè)文件;Git也不會(huì)自動(dòng)降至納入跟蹤范圍,說(shuō)白了就是在倉(cāng)庫(kù)中是黑戶,未登記.雖然冷凍室里偶爾會(huì)有老鼠, 但是食物登記上可沒有, 管理系統(tǒng)(Git)也不會(huì)主動(dòng)添加上來(lái)

  1. 跟蹤新文件
$ git add studyGit
$ git status
位于分支 develop
您的分支與上游分支 'origin/develop' 一致。
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    新文件:       studyGit

這時(shí)該文件處于 暫存狀態(tài)( staged); 另外 git add 以目錄為參數(shù),則會(huì)遞歸跟蹤該目錄下的所有文件.

  1. 暫存已修改文件
$ 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ì)提交.

  1. 其他
$ git status -s ## 簡(jiǎn)略信息
M  CONTRIBUTORS
A  studyGit
$ cat .gitignore ## 忽略的文件, 正則表達(dá)式
$ git diff
  1. 提交更新
$ 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)程倉(cāng)庫(kù)中的分支的索引。遠(yuǎn)程分支本地可以查看但是無(wú)法移動(dòng),只有在進(jìn)行網(wǎng)絡(luò)交互時(shí)才會(huì)更新。
當(dāng)你git clone 遠(yuǎn)端Git服務(wù)器里的代碼時(shí),Git自動(dòng)將此遠(yuǎn)程倉(cāng)庫(kù)命名為origin, 并建立一個(gè)指向該倉(cāng)庫(kù)master分支的指針: origin/master

# 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)名
$ git clone -o 希望的倉(cāng)庫(kù)名 遠(yuǎn)程git URL
# 通過(guò) git branch 可以查看當(dāng)前本地分支
?   git:(chlq_cases) ? git branch
* chlq_cases
  master
# 通過(guò) 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ǔ)庫(kù)下載對(duì)象和引用。
git refspec 詳解

# 同步 遠(yuǎn)程倉(cāng)庫(kù) 中的數(shù)據(jù) 到 本地
$ git fetch <遠(yuǎn)程倉(cāng)庫(kù)名> 
# 同步 遠(yuǎn)程倉(cāng)庫(kù) 制定分支 的數(shù)據(jù) 到 本地
$ git fetch <遠(yuǎn)程倉(cāng)庫(kù)名> <分支名>
# 同步 遠(yuǎn)程倉(cāng)庫(kù)origin 的master分支 的數(shù)據(jù) 到 本地 origin/master 里
$git fetch origin master 
# git fetch <refspec> 
# Refspec 的格式是一個(gè)可選的 + 號(hào),接著是 <src>:<dst> 的格式,這里 <src> 是遠(yuǎn)端上的引用格式, <dst> 是將要記錄在本地的引用格式??蛇x的 + 號(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)程倉(cāng)庫(kù)> < 遠(yuǎn)程分支>:<本地分支>
$ git pull origin master:chlq_cases
# 取回遠(yuǎn)程origin倉(cāng)庫(kù)的master分支, 與本地chlq_cases分支合并
# 不加 本地分支, 則默認(rèn)合并當(dāng)前分支
$ git pull origin master # 等效于下面的兩句
$ git fetch origin
$ git merge origin/master

git push

git push 命令用于將本地分支的更新,推送到遠(yuǎn)程倉(cāng)庫(kù)

$ git push <遠(yuǎn)程倉(cāng)庫(kù)> <本地分支>:<遠(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)端倉(cāng)庫(kù)
$git push origin your-tag-name
$##列出說(shuō)有tag
$git tag -l

追蹤

fork 及 上傳到upstream

勤快學(xué):git教程

撤銷操作

git-撤銷操作

對(duì)commited的文件

$ git reset HEAD <file>...

對(duì)added的文件

$ git checkout -- <file>...

git stash

##簡(jiǎn)單實(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

git-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 - 代碼回滾

#回退命令:
$ 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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,872評(píng)論 1 26
  • 1.設(shè)置 初次使用需要設(shè)置姓名和郵箱git config --global user.name "git用戶名"g...
    jrg陳咪咪sunny閱讀 829評(píng)論 0 1
  • 有一些毛病希望你知道 有一些熱忱也希望你知道 茱萸,是一種常綠帶香的植物。 一味中藥。 茱萸的花語(yǔ)竟是富貴吉祥、驅(qū)...
    衣錦夜行在人間閱讀 914評(píng)論 0 0
  • 我知道,25歲,我終于做了一件放肆的事…… 同居,跟一個(gè)認(rèn)識(shí)一個(gè)月的人同居,他說(shuō)好不會(huì)給我任何名分,連私下里都不會(huì)...
    兜兜的簡(jiǎn)書閱讀 331評(píng)論 0 0

友情鏈接更多精彩內(nèi)容