溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

commit和commit -a的區(qū)別

發(fā)布時(shí)間:2020-08-31 04:24:39 來(lái)源:網(wǎng)絡(luò) 閱讀:1125 作者:donworry 欄目:開發(fā)技術(shù)
commit和commit -a的區(qū)別, commit -a相當(dāng)于:

    第一步:自動(dòng)地add所有改動(dòng)的代碼,使得所有的開發(fā)代碼都列于index file中
    第二步:自動(dòng)地刪除那些在index file中但不在工作樹中的文件
    第三步:執(zhí)行commit命令來(lái)提交

對(duì)于有刪除文件,可以git commit -a 或 git add -A
注意git add -A 會(huì)把我們未通過(guò) git rm 刪除的文件全部stage,
git commit -a是刪除的文件會(huì)自動(dòng)標(biāo)記, 但對(duì)新建文件就不行

git rm 刪除當(dāng)?shù)匚募蚷ndex里的文件
git  rm -r 刪除文件夾
git rm --cached刪除index里的文件

用git show 的時(shí)候commit只需要5,6位就可以了

對(duì)于add后但沒(méi)有commit的又想去除的,可以用git reset --filename

當(dāng)合并失敗git會(huì)提示那些沖突無(wú)法自動(dòng)合并,有兩種解決方法:
手工修改這些文件,合并其中的內(nèi)容,然后commit。
使用當(dāng)前分支,或者要合并分支的內(nèi)容,然后提交
git checkout –ours <conflict file>
git checkout –theirs <conflict file>

git-whatchanged和git diff差不多:
$ git-whatchanged -p init/main.c
7.錯(cuò)誤提交了commit怎么辦?
a) git-revert
這個(gè)本身就會(huì)產(chǎn)生一個(gè)commit,如果用得多了會(huì)讓你的log看起來(lái)不那么干凈。;-)
b) git-reset
用這個(gè)要當(dāng)心,它會(huì)把那個(gè)commit之后的commit全部刪除。一個(gè)好的辦法是:先建立一個(gè)臨時(shí)的分支,然后再git-reset,再git-rebase,最后再刪除臨時(shí)的分支。 詳細(xì)可以看這里。



$ git add -p // 為你做的每次修改,Git將為你展示變動(dòng)的代碼,并詢問(wèn)該變動(dòng)是否應(yīng)是下一次提交的一部分?;卮稹皔”或者“n”。也有其他選項(xiàng),比如延遲決定:鍵入“?”來(lái)學(xué)習(xí)更多。

git add <path>表示 add to index only files created or modified and not those deleted
我通常是通過(guò)git add <path>的形式把我們<path>添加到索引庫(kù)中,<path>可以是文件也可以是目錄。
git不僅能判斷出<path>中,修改(不包括已刪除)的文件,還能判斷出新添的文件,并把它們的信息添加到索引庫(kù)中。
三、git add -u
git add -u 表示 add to index only files modified or deleted and not those created
git add -u [<path>]: 把<path>中所有tracked文件中被修改過(guò)或已刪除文件的信息添加到索引庫(kù)。它不會(huì)處理untracted的文件。
省略<path>表示.,即當(dāng)前目錄。
四、git add -A
git add -A: [<path>]表示把<path>中所有tracked文件中被修改過(guò)或已刪除文件和所有untracted的文件信息添加到索引庫(kù)。
省略<path>表示.,即當(dāng)前目錄。
五、git add -i
我們可以通過(guò)git add -i [<path>]命令查看<path>中被所有修改過(guò)或已刪除文件但沒(méi)有提交的文件,
并通過(guò)其revert子命令可以查看<path>中所有untracted的文件,同時(shí)進(jìn)入一個(gè)子命令系統(tǒng)。
比如:
 git add -i
           staged     unstaged path
  1:        +0/-0      nothing branch/t.txt
  2:        +0/-0      nothing branch/t2.txt
  3:    unchanged        +1/-0 readme.txt

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now>
這里的t.txt和t2.txt表示已經(jīng)被執(zhí)行了git add,待提交。即已經(jīng)添加到索引庫(kù)中。
readme.txt表示已經(jīng)處于tracked下,它被修改了,但是還沒(méi)有被執(zhí)行了git add。即還沒(méi)添加到索引庫(kù)中。
5.1、revert子命令
可以通過(guò)git add -i的revert子命令(3: [r]evert)把已經(jīng)添加到索引庫(kù)中的文件從索引庫(kù)中剔除。
(3: [r]evert)表示通過(guò)3或r或revert加回車執(zhí)行該命令。執(zhí)行該命令后,git會(huì)例出索引庫(kù)中的文件列表.
然后通過(guò)數(shù)字來(lái)選擇。輸入"1"表示git會(huì)例出索引庫(kù)中的文件列表中的第1個(gè)文件。
"1-15"表示git會(huì)例出索引庫(kù)中的文件列表中的第1個(gè)文件到第15個(gè)文件.回車將執(zhí)行。
如果我們不輸入任何東西,直接回車,將結(jié)束revert子命令,返回git add -i的主命令行。
5.2、update子命令
可以通過(guò)update子命令(2: [u]pdate)把已經(jīng)tracked的文件添加到索引庫(kù)中。其操作和revert子命令類似。
5.3、add untracked子命令
通過(guò)add untracked子命令(4: [a]dd untracked)可以把還沒(méi)被git管理的文件添加到索引庫(kù)中。其操作和revert子命令類似。
5.4、diff子命令
可以通過(guò)diff子命令(6: [d]iff)可以比較索引庫(kù)中文件和原版本的差異。其操作和revert子命令類似。
5.5、status子命令
status子命令(1: [s]tatus)功能上和git add -i相似
5.6、quit子命令
quit子命令(7: [q]uit)用于退出git add -i命令系統(tǒng)
六、幫助
我們可以通過(guò)git add -h命令來(lái)看git add命令的幫助文檔。
 git add -h
usage: git add [options] [--] <filepattern>...

    -n, --dry-run         dry run
    -v, --verbose         be verbose

    -i, --interactive     interactive picking
    -p, --patch           select hunks interactively
    -e, --edit            edit current diff and apply
    -f, --force           allow adding otherwise ignored files
    -u, --update          update tracked files
    -N, --intent-to-add   record only the fact that the path will be added later
    -A, --all             add changes from all tracked and untracked files
    --refresh             don't add, only refresh the index
    --ignore-errors       just skip files which cannot be added because of errors
    --ignore-missing      check if - even missing - files are ignored in dry run

2)分支(branch)操作相關(guān)命令
查看本地分支:$ git branch
查看遠(yuǎn)程分支:$ git branch -r
創(chuàng)建本地分支:$ git branch [name] ----注意新分支創(chuàng)建后不會(huì)自動(dòng)切換為當(dāng)前分支
切換分支:$ git checkout [name]
創(chuàng)建新分支并立即切換到新分支:$ git checkout -b [name]
刪除分支:$ git branch -d [name] ---- -d選項(xiàng)只能刪除已經(jīng)參與了合并的分支,對(duì)于未有合并的分支是無(wú)法刪除的。如果想強(qiáng)制刪除一個(gè)分支,可以使用-D選項(xiàng)
重命名分支:git branch -m <old_name> <new_name> 改名字 (如果有同名會(huì)失敗,改用 -M 可以強(qiáng)制覆蓋)
合并分支:$ git merge [name] ----將名稱為[name]的分支與當(dāng)前分支合并
創(chuàng)建遠(yuǎn)程分支(本地分支push到遠(yuǎn)程):$git push origin [name]
刪除遠(yuǎn)程分支:$ git push origin :heads/[name]
我從master分支創(chuàng)建了一個(gè)issue5560分支,做了一些修改后,使用git push origin master提交,但是顯示的結(jié)果卻是'Everything up-to-date',發(fā)生問(wèn)題的原因是git push origin master 在沒(méi)有track遠(yuǎn)程分支的本地分支中默認(rèn)提交的master分支,因?yàn)閙aster分支默認(rèn)指向了origin master 分支,這里要使用git push origin issue5560:master 就可以把issue5560推送到遠(yuǎn)程的master分支了。
    如果想把本地的某個(gè)分支test提交到遠(yuǎn)程倉(cāng)庫(kù),并作為遠(yuǎn)程倉(cāng)庫(kù)的master分支,或者作為另外一個(gè)名叫test的分支,那么可以這么做。

$ git push origin test:master         // 提交本地test分支作為遠(yuǎn)程的master分支
$ git push origin test:test              // 提交本地test分支作為遠(yuǎn)程的test分支

如果想刪除遠(yuǎn)程的分支呢?類似于上面,如果:左邊的分支為空,那么將刪除:右邊的遠(yuǎn)程的分支。

$ git push origin :test              // 剛提交到遠(yuǎn)程的test將被刪除,但是本地還會(huì)保存的,不用擔(dān)心
3)版本(tag)操作相關(guān)命令
查看版本:$ git tag
創(chuàng)建版本:$ git tag [name]
刪除版本:$ git tag -d [name]
查看遠(yuǎn)程版本:$ git tag -r
創(chuàng)建遠(yuǎn)程版本(本地版本push到遠(yuǎn)程):$git push origin [name]
刪除遠(yuǎn)程版本:$ git push origin :refs/tags/[name]

4) 子模塊(submodule)相關(guān)操作命令
添加子模塊:$ git submodule add [url] [path]
如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模塊:$ git submodule init ----只在首次檢出倉(cāng)庫(kù)時(shí)運(yùn)行一次就行
更新子模塊:$ git submodule update ----每次更新或切換分支后都需要運(yùn)行一下
刪除子模塊:(分4步走哦)
1)$ git rm --cached [path]
2) 編輯“.gitmodules”文件,將子模塊的相關(guān)配置節(jié)點(diǎn)刪除掉
3) 編輯“.git/config”文件,將子模塊的相關(guān)配置節(jié)點(diǎn)刪除掉
4) 手動(dòng)刪除子模塊殘留的目錄

5)忽略一些文件、文件夾不提交
在倉(cāng)庫(kù)根目錄下創(chuàng)建名稱為“.gitignore”的文件,寫入不需要的文件夾名或文件,每個(gè)元素占一行即可,如
target
bin
*.db
 
 

關(guān)于git刪除遠(yuǎn)程分支
git branch -r -d origin/branch-name
發(fā)現(xiàn)只是刪除的本地對(duì)該遠(yuǎn)程分支的track,正確的方法應(yīng)該是這樣:

git push origin :branch-name

冒號(hào)前面的空格不能少,原理是把一個(gè)空分支push到server上,相當(dāng)于刪除該分支。


查看遠(yuǎn)程倉(cāng)庫(kù):$ git remote -v
添加遠(yuǎn)程倉(cāng)庫(kù):$ git remote add [name] [url]
刪除遠(yuǎn)程倉(cāng)庫(kù):$ git remote rm [name]
修改遠(yuǎn)程倉(cāng)庫(kù):$ git remote set-url --push[name][newUrl]

commit

提交修改的代碼(只是提交到本地的代碼庫(kù),不會(huì)推送到服務(wù)器

$ git commit -am '修改說(shuō)明'

如果覺(jué)得剛提交的“修改說(shuō)明”寫得不夠好,可輸入以下命令調(diào)整

$ git commit --amend

push

將自上次 push 以來(lái)的,本地歷次 commit,推送到服務(wù)器

結(jié)合我們的實(shí)際,應(yīng)該這樣寫:

$ git push origin master:your-id

其中,master 是本地的分支名;your-id 填你在服務(wù)器上的 id,服務(wù)器的版本庫(kù)里會(huì)有以你的 id 為名稱的分支。


tag

在git中可以為任意其他對(duì)象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1標(biāo)識(shí)git對(duì)象,這是一個(gè)40個(gè)字符長(zhǎng)度的字符串,不方便記憶,那么可為git對(duì)象添加一個(gè)tag便于標(biāo)識(shí)不同對(duì)象。
添加tag

# git tag tag-name sha-1
$ git tag v1.0 bdc390c2

這樣便為bdc390c2的對(duì)象添加了一個(gè)tag,如果不指定sha-1,會(huì)為最近的一個(gè)commit對(duì)象添加tag
查看tag

使用git tag命令便能查看所有tag

$ git tag

當(dāng)然可以篩選

$ git tag -l 'v1.*'

刪除tag

$ git tag -d <tag-name>

重命名tag

重命名tag有兩種方式:

    刪除原tag,重新添加
    git tag -f 強(qiáng)制替換已存在的tag后,再刪除原tag

$ git tag -f <new-tag> <old-tag>
$ git tag -d <old-tag>

tag的分類

    輕量型標(biāo)簽 輕量型標(biāo)簽直接使用 $ git tag <tag-name> <git-object> 即可創(chuàng)建
    標(biāo)注型(annotated)標(biāo)簽 標(biāo)注型標(biāo)簽可記錄更多的信息,使用 $ git tag -a <tag-name> <git-object> -m ‘tag message’即可創(chuàng)意一個(gè)標(biāo)注性標(biāo)簽


#git cherry-pick 321d76f
這個(gè)執(zhí)行過(guò)程git已經(jīng)執(zhí)行了一個(gè)commit過(guò)程。
如果有的時(shí)候我們要直接提交怎么辦呢?
#git cherry-pick -n 321d76f
通過(guò)添加-n參數(shù),git只會(huì)將變化提交到緩存中,沒(méi)有執(zhí)行commit
待你修改完其它后可以一起commit了
#git commit

git branch -v命令將附加顯示最后一次提交相關(guān)信息的分支信息
$ git branch -v
# 查看已合并的分支
$ git branch --merge
# 查看未合并的分支
$ git branch --no-merged

ignore

在一個(gè)git版本倉(cāng)庫(kù)中,有時(shí)候很多文件/目錄并不需要使用git進(jìn)行版本維護(hù),那么就可以將這些文件/目錄加入.gitignore文件中, 在.gitignore文件中可定義要排除在git版本管理之外的文件/目錄,git默認(rèn)會(huì)讀取項(xiàng)目目錄下的.gitignore文件。
.gitignore使用標(biāo)準(zhǔn)的shell glob模式匹配,shell glob你可以簡(jiǎn)單地理解為一種特特殊化的正則表達(dá)式,其實(shí)要比正則表達(dá)式簡(jiǎn)單許多,語(yǔ)法如下:
  •  允許使用空行,沒(méi)有實(shí)際語(yǔ)法作用
  • # 開頭的行視作注釋
  • ! 開頭的模式會(huì)覆蓋之前的定義,將匹配的對(duì)象重新加入跟蹤列表
  • 以/結(jié)尾的模式,git會(huì)屏蔽掉該目錄及其所有子目錄及文件(只屏蔽目錄)
  • 不以/結(jié)尾的模式,git屏蔽同名的文件名及目錄(屏蔽目錄和同名文件)
  • 以/開頭的模式,git只會(huì)屏蔽項(xiàng)目根目錄下的匹配對(duì)象
示例:
#.gitignore example .txt .gitignore !readme.txt exclude/*.txt
該.gitignore中定義的屏蔽規(guī)則為:
屏蔽所有的txt文件,但是readme.txt例外;屏蔽所有的.gitignore文件;屏蔽exclude目錄下的所有txt文件(包括readme.txt)。
另外,還可以在配置項(xiàng)中通過(guò)core.excludesfile來(lái)指定ignore文件。
$ git config core.excludesfile '_myignore'

git配置

git配置文件根據(jù)作用域的不同分為三種:
  • 系統(tǒng)配置文件(git安裝目錄/gitconfig)
  • 用戶配置文件(用戶主目錄/.gitconfig)
  • 項(xiàng)目配置文件(.git/config)
git配置項(xiàng)都通過(guò)git config命令寫入,傳入不同參數(shù)寫入不同的配置文件
$ git config --system/--global/
  • git config –system 寫入系統(tǒng)配置
  • git config –global 寫入用戶配置
  • git config 寫入項(xiàng)目配置
具體的配置項(xiàng)設(shè)置參考幫助文檔,$ git config –help

git中的對(duì)象

commit和commit -a的區(qū)別
commit和commit -a的區(qū)別
git對(duì)象
git中包含4類對(duì)象:
  • commit 提交對(duì)象
  • tree 目錄
  • blob 文件
  • tag 標(biāo)記
git提交便產(chǎn)生一個(gè)commit對(duì)象,commit對(duì)象中包含一個(gè)tree對(duì)象,tree對(duì)象中又會(huì)包含其他的tree對(duì)象或是blob對(duì) 象,blob對(duì)象是最小的組成單元,即獨(dú)立的文件。每個(gè)對(duì)象都對(duì)應(yīng)一個(gè)唯一的SHA-1值,只有當(dāng)文件或目錄有修改時(shí)這個(gè)值才會(huì)重新計(jì)算發(fā)生改變。
  • $ git log 可以查看所有commit對(duì)象
  • $ git ls-tree <commit> 查看commit對(duì)象中的tree對(duì)象
  • $ git show <blob> 查看blob的具體內(nèi)容

git原理

究竟git是如何工作的?打開.git目錄便可一目了然。
  • HEAD 指向當(dāng)前分支
  • config 項(xiàng)目配置文件
  • description 供GitWeb程序使用
  • hooks/ 客戶端與服務(wù)端鉤子腳本
  • info/ 忽略模式
  • index 暫存區(qū)域信息
  • objects/ 所有數(shù)據(jù)內(nèi)容
  • refs/ 指向所有commit的指針
HEAD文件中是形如以下代碼的內(nèi)容:
ref: refs/heads/dev
它指向refs/heads/dev,而dev文件中代碼指向當(dāng)前分支最近的commit對(duì)象
objects目錄中保存有所有g(shù)it對(duì)象,這些對(duì)象取sha-1值的前兩個(gè)字母為一個(gè)目錄,剩下的38個(gè)字符作為文件名保存,在上一節(jié)“git中 對(duì)象”中能查看到的所有g(shù)it對(duì)象都保存在這個(gè)目錄中,可以使用git cat-file <sha-1>來(lái)獲取對(duì)象內(nèi)容。
$ git cat-file -p 63a46849
不妨多使用cat-file命名多看看各種對(duì)象的內(nèi)容,有助于理解git對(duì)象的結(jié)構(gòu)。
refs目錄中保存了git中使用的所有引用或指針,因?yàn)椴豢赡苋魏螘r(shí)候都是用sha-1值來(lái)指代對(duì)象,git對(duì)象也可以有“縮略名”。通常refs目錄會(huì)包含以下目錄:
  • heads 保存所有分支的HEAD指針
  • remotes 保存遠(yuǎn)程倉(cāng)庫(kù)信息
  • tags 保存所有tag指針
逐一地查看這些文件內(nèi)容,你就什么都明白了。使用 git update-ref 命令可以直接新建一個(gè)引用。
$ git update-ref refs/heads/test-branch c56dce $ git update-ref refs/tags/test-tag c56dce
執(zhí)行上述命令,這樣你的git版本庫(kù)中就多了一個(gè)test-branch分支和一個(gè)名為test-tag的tag。
其他的比如git還有些底層的命令,我在文中所列舉的,包括之前基礎(chǔ)篇的都是一些高級(jí)命令??梢允褂眠@些底層命名直接對(duì)git庫(kù)進(jìn)行一些操作,有關(guān)git底層命名的詳細(xì)內(nèi)容,可以到網(wǎng)上去找找。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI