獲取與創(chuàng)建項目
- 創(chuàng)建倉庫的途徑有:
- 在本地已有的目錄,初始化一個新的蔚鸥;
- 克隆復(fù)制一份別人的項目动雹。
git init
- 在當(dāng)前目錄下創(chuàng)建.git目錄,同時當(dāng)前目錄成為一個Git倉庫拿诸。
git clone
-
git clone Git倉庫url
:將http或ssh鏈接指向的Git倉庫拷貝到本地扒袖。 -
git clone Git倉庫url 本地目錄路徑
:將遠(yuǎn)程Git倉庫拷貝到本地指定目錄。
添加與提交
基本流程
- 使用
git add
添加需要追蹤的新文件和待提交的更改亩码; - 使用
git status
和git diff
查看有何改動季率; - 使用
git commit
提交快照。
git add
-
git add 文件
:將文件添加到緩存區(qū)描沟,該文件被標(biāo)記為被追蹤飒泻。 -
git add .
:緩存當(dāng)前目錄下所有文件,不包括已刪除的文件吏廉。
- 注意泞遗,git add只是復(fù)制一份當(dāng)前狀態(tài)下的該文件到緩存區(qū),該文件之后的修改若不重新git add席覆,則提交的時候史辙,只會將上次git add的緩存提交給倉庫。
git commit
將緩存寫入倉庫中。
git add
是工作區(qū)->緩存區(qū)髓霞,git commit
是緩存區(qū)->倉庫卦睹。git commit -m "本次提交說明"
:一次性將緩存區(qū)所有文件修改提交到倉庫的當(dāng)前分支。git commit -am "本次提交說明"
:自動把所有已經(jīng)跟蹤過的文件緩存方库,并提交到倉庫结序。常用于跳過git add
步驟快速提交。git commit --amend "本次提交說明"
:重新提交纵潦。此次提交代替上一次提交的結(jié)果徐鹤。尤其適用于提交完了才發(fā)現(xiàn)漏掉了幾個文件沒有添加,或者提交信息寫錯了的情況邀层。
git status
git status
:顯示當(dāng)前倉庫的最新狀態(tài)返敬。-
git status -s
:當(dāng)前倉庫的最新狀態(tài)的簡介。- 狀態(tài)值第一欄是關(guān)于緩存區(qū)的(綠色)寥院,第二欄是關(guān)于工作區(qū)的(紅色)劲赠。
- ??表示該文件僅是本地文件。
- 綠色A表示該文件以前沒被提交過秸谢,添加到緩存凛澎;(提交時會告知倉庫添加此快照)。
- 綠色M表示該文件以前被提交過后估蹄,又添加到緩存塑煎;(提交時會告知倉庫修改此快照)。
- 綠色D表示該文件以前被提交過后臭蚁,被本地刪除了最铁,又刪除緩存;(提交時會告知倉庫刪除此快照)垮兑。
- 綠色R表示該文件添加到快照時冷尉,系統(tǒng)發(fā)現(xiàn)某個D快照與其相同,并將D文件名改為該文件名系枪。
- 紅色M表示該文件被本地修改過网严。
- 紅色D表示該文件被本地刪除了。
- 狀態(tài)值第一欄是關(guān)于緩存區(qū)的(綠色)寥院,第二欄是關(guān)于工作區(qū)的(紅色)劲赠。
git diff
-
git diff
:比較工作區(qū)和緩存區(qū)的不同嗤无。 -
git diff --cached
:比較緩存區(qū)和倉庫的不同震束。 -
git diff 文件
:比較指定文件在工作區(qū)和緩存區(qū)的不同。 -
git diff 文件 --cached
:比較指定文件在緩存區(qū)和倉庫的不同当犯。
-
git diff 提交版本號1 提交版本號2
:比較兩次提交之間的區(qū)別垢村。 -
git diff 分支1 分支2
:比較兩個分支之間的區(qū)別。
- 注意:只會比較那些跟蹤文件(即
git add
過的文件)嚎卫。
git show
-
git show
:查看最后一個提交的內(nèi)容嘉栓。 -
git show HEAD~1
:查看倒數(shù)第二個提交的內(nèi)容宏榕。 -
git show 提交版本號
:查看指定提交的內(nèi)容。
刪除與恢復(fù)
git rm
主要用于從版本庫中刪除文件侵佃。
git rm 文件
:把文件從版本庫中刪除麻昼,不再跟蹤。git rm log/\*.log
:將log目錄下擴展名為.log的所有文件從版本庫中刪除馋辈,不再跟蹤抚芦。通常適用于不小心把一些編譯、日志迈螟、debug文件錯誤提交到版本庫叉抡。
-
git rm -f 文件
:當(dāng)文件有未提交的緩存區(qū)修改時,直接使用git rm 文件
會報錯答毫。此時執(zhí)行此命令可強制將文件從緩存區(qū)和版本庫中刪除褥民。
-
git rm --cached 文件
:把文件從版本庫中刪除,但讓文件保留在工作區(qū)且不被Git繼續(xù)跟蹤洗搂。通常適用于rm文件之后把其添加到.gitignore中消返。
恢復(fù)
-
git checkout -- 文件
:丟棄工作區(qū)的修改。此文件必須是Git跟蹤的耘拇。- 修改后仍未放到緩存區(qū)撵颊,恢復(fù)到上一次
git commit
的狀態(tài)。 - 添加到緩存區(qū)后又做了修改驼鞭,恢復(fù)到上一次
git add
的狀態(tài)。
- 修改后仍未放到緩存區(qū)撵颊,恢復(fù)到上一次
-
git reset HEAD 文件
:丟棄緩存區(qū)的修改尺碰,回退到工作區(qū)挣棕。
-
git reset --hard
:重置所有文件到上次commit的狀態(tài)。 -
git reset --hard HEAD~1
:將當(dāng)前分支重置為倒數(shù)第2個版本亲桥。 -
git reset --hard 提交版本號
:將當(dāng)前分支重置為指定版本洛心。
版本控制
版本號
Git的版本號是SHA1校驗和,而不是用遞增的1题篷、2词身、3……,因為分布式的版本控制系統(tǒng)要確保每個用戶的修改記錄都是唯一的番枚,不會發(fā)生版本號沖突的情況法严。
HEAD
表示當(dāng)前版本,HEAD^
表示上一個版本葫笼,HEAD~100表示往上100個版本深啤。
git log
-
git log
:顯示從最近到最遠(yuǎn)的提交日志。包含每個提交的SHA1校驗和路星、作者的名字和郵箱溯街、提交時間以及提交說明等。 -
git log --oneline
:git log
的簡要版 -
git log --decorate
:不僅輸出git log
的信息,還帶標(biāo)簽等額外信息呈昔。 -
git log --graph
不僅輸出git log
的信息挥等,還可查看當(dāng)前分支什么時候出現(xiàn)了分支、合并堤尾。
-
git log 分支名
:查看指定分支的提交日志肝劲。 -
git log 要查看的分支名branchA ^要忽略的分支名branchB
:查看branchA的日志信息(排除branchB的信息)
git reflog
- 記錄每一次的版本改動。包括commit記錄哀峻、reset版本退回記錄涡相。
git tag
-
git tag
:查看所有標(biāo)簽。注意:標(biāo)簽不是按時間列出剩蟀,而是按字母排序催蝗。 -
git show <tag-name>
:查看指定標(biāo)簽的信息。
-
git tag <tag-name> <commit-id>
:在指定版本號上打上標(biāo)簽育特。
-
git checkout <tag-name>
:切換到指定標(biāo)簽丙号。
-
git push --tags
:將標(biāo)簽推送給遠(yuǎn)程倉庫。
遠(yuǎn)程項目
git remote
-
git remote add <shortname> <url>
:添加并關(guān)聯(lián)一個遠(yuǎn)程庫缰冤。shortname一般為origin犬缨。-
以http方式添加
git remote add origin https://github.com/daking1991/GitTest.git
-
以ssh方式添加
git remote add origin git@github.com:daking1991/GitTest.git
-
git remote
:查看已配置的遠(yuǎn)程倉庫,列出各遠(yuǎn)程倉庫的shortname棉浸。-
git remote -v
:查看已配置的遠(yuǎn)程倉庫的讀寫url怀薛。// git remote -v origin git@github.com:daking1991/GitTest.git (fetch) origin git@github.com:daking1991/GitTest.git (push)
-
git remote show <shortname>
:查看shortname對應(yīng)的遠(yuǎn)程倉庫的fetch和push等詳細(xì)信息。* remote origin Fetch URL: git@github.com:daking1991/GitTest.git Push URL: git@github.com:daking1991/GitTest.git HEAD branch: (unknown)
-
git remote rm <shortname>
:移除指定的遠(yuǎn)程倉庫迷郑。
-
git remote rename <old_shortname> <new_shortname>
:重命名一個遠(yuǎn)程倉庫的shortname枝恋。
git push
-
git push <remote-repo-shortname> <local-branch>
:將本地分支推送到遠(yuǎn)程倉庫。
拉取
git pull <remote-shortname> <local-branch>
:拉取遠(yuǎn)程倉庫最新提交嗡害,并合并到指定的本地分支上焚碌。git fetch
:拉取遠(yuǎn)程倉庫最新提交,但不會自動合并分支霸妹。
分支
git branch
-
git branch
:列出本地分支列表十电。當(dāng)前分支前會標(biāo)有*號
。 -
git branch -r
:列出遠(yuǎn)程分支列表叹螟。 -
git branch -a
:列出所有分支列表鹃骂。
-
git branch 分支
:創(chuàng)建新分支。 -
git branch -d 分支
:刪除指定分支罢绽。
-
git branch -v -a
:查看所有分支的最后一次提交偎漫。
git checkout
-
git checkout 分支
:切換到指定分支。 -
git checkout -b 分支
:創(chuàng)建并切換到指定分支有缆。
git merge
-
git merge 分支
:將指定分支合并到當(dāng)前分支上象踊。
合并沖突
-
不同分支修改了相同區(qū)塊的代碼時温亲,合并分支時git會將此部分標(biāo)記為沖突,需要用戶手動去修改杯矩。
-
可用
git diff
查看沖突詳情 -
可用
git status -s
查看沖突文件栈虚,狀態(tài)標(biāo)識為UU。 手動修改后史隆,使用
git add
重新寫入緩存區(qū)魂务。
子模塊
- 一個大型工程拆分為一些子工程。既有利于降低工程開發(fā)難度泌射,也有利于使用現(xiàn)成的方案或第三方方案作為子工程粘姜。
添加子模塊
-
步驟
-
在某工程的根目錄下,執(zhí)行
git submodule add git@git.oschina.net:daking/android-client-common.git
-
會多出一個.gitmodules文件熔酷,此為子模塊配置文件孤紧,其內(nèi)容為
[submodule "android-client-common"] path = android-client-common url = git@git.oschina.net:daking/android-client-common.git # 若有多個子模塊,則會有多個條目...
-
-
指定submodule在父工程中的位置
git submodule add git@git.oschina.net:daking/android-client-jni.git ./app/src/main/jni/api
-
指定submodule要跟蹤的分支
submodule add添加的子模塊默認(rèn)是處于游離狀態(tài)的拒秘,并不處于任何分支上号显。
-
可指定其要跟蹤的分支:
- git submodule add git倉庫路徑 -b 要跟蹤的分支名
- 或直接在.gitmodules配置文件中對應(yīng)子模塊下增加branch = 要跟蹤的分支名。
clone一個帶子模塊的Git倉庫
- 方案1
-
git clone Git倉庫路徑
躺酒; - 初始化以及更新子模塊:
git submodule init
押蚤,git submodule update
。
-
- 方案2
git clone --recursive Git倉庫路徑
參數(shù)--recursive會遞歸初始化并更新每個子模塊羹应。
更新子模塊
- 先更新子模塊揽碘,
git submodule update
。若嵌套多層子模塊园匹,則git submodule foreach "git submodule update"
雳刺。 - 再更新主倉庫。
子模塊的修改提交
- 在子模塊的根目錄下偎肃,切換到要修改的分支煞烫,再進(jìn)行代碼修改浑此。這是因為submodule的HEAD默認(rèn)是處于游離狀態(tài)累颂,它并沒在任何分支上。
- 在子模塊的根目錄進(jìn)行Git提交凛俱。
- 在主Git倉庫的根目錄進(jìn)行Git提交紊馏。
刪除子模塊
刪除子模塊的Git緩存,
git rm --cached android-client-common/
刪除子模塊的本地文件蒲犬,
rm -rf android-client-common/
-
刪除與此子模塊相關(guān)的配置
rm -rf .git/modules/android-client-common/ .gitmodules中的相關(guān)配置 .git/config中的相關(guān)配置
-
修改提交
git add .gitmodules git commit -m 'remove submodule: android-client-common' git push
git config
-
git config --list
:列出所有配置信息朱监。 -
git config <key>
:檢查關(guān)鍵字key的配置。如git config user.name
原叮,查看姓名配置赫编。
-
git config --global alias.命令別名 命令
:為指定命令配置一個別名巡蘸,可快速輸入命令。git config --global alias.unadd 'reset HEAD'
:使用git unadd 文件
可丟棄指定文件在緩存區(qū)的修改擂送。git config --global alias.st status
:使用git st
代替git status
悦荒。git config --global alias.co checkout
:使用git co
代替git checkout
。git config --global alias.cm commit
:使用git cm
代替git commit
嘹吨。git config --global alias.br branch
:使用git br
代替git branch
搬味。-
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
:使用git lg
輸出高逼格的日志信息。 -
git config --global alias.last 'log -1'
:使用git last
顯示最近一次的提交蟀拷。
-
git config --global user.name "yourname"
和git config --global user.email "youremail"
:修改姓名和郵箱碰纬,去掉--global
可針對每個repo單獨設(shè)定。