git从入门到放弃

到你想进行版本控制的文件所在的目录下(该目录便是工做区) 查看状态 git statushtml

初始化 git initgit

添加到暂存区 git addsegmentfault

提交到版本库 git commit -m "注释"3d

为何Git添加文件须要两步呢?一步add,一步commit。嘿嘿,由于commit命令能够一次提交多个文件,因此你能够屡次使用add命令呢。(至关于在某地集合而后你们一块儿去网吧开黑,固然你也能够自个去)版本控制

然而咱们在工做区的文本中添加一行内容

想知道作了哪些修改的话可使用命令 git diff(仅对已追踪的文件好使)code

再次修改文件再次添加htm

版本回滚

多添加提交几回 用git log命令能够查看最近几回提交的版本。若是你发现内容太多,能够用这个命令查看 git log --pretty=oneline -n(n表示显示几条记录)blog

在Git中咱们用HEAD表示当前版本,也就是咱们最新提交的,上一个版本就应该这么表示”HEAD^“,再上一个版本就这样表示”HEAD^^“,固然若是有几十个版本或者1000个版本,咱们还要写1000个^,这是不可能的,因此哟。咱们写成这样HEAD~1000get

回退到上一版本git reset --hard HEAD^(慎用,了解详情it

想回到某个版本 git reset --hard 版本号(这个会改变工做区,暂存区的数据,慎用,了解详情)

咱们在工做区新建一个文本b.txt,再git status查看状态,提示

由于工做区新建的b.txt没有被add到暂存区,git提示咱们有一个untracked(未被追踪)的文件。(能够用git add <file>命令添加到暂存区)

在工做区修改已经git add 过的readme.txt文本,查看状态提示:

changes not staged for commit :意思是readme.txt已经被修改了但还未添加到暂存区 Git会告诉你有你个文件被修改,你有两个选择,一个用 git add 提交到暂存区,另外一个是用git checkout能够丢弃工做区的修改。命令git checkout -- readme.txt意思就是,把readme.txt文件在工做区的修改所有撤销(discard changes(放弃修改)),这里有两种状况:

  • 一种是readme.txt自修改后尚未被放到暂存区,如今撤销修改就回到和版本库如出一辙的状态;
  • 另外一种是readme.txt已经添加到暂存区后,又做了修改,如今撤销修改就回到添加到暂存区后的状态。 总之,就是让这个文件回到最近一次git commit或git add时的状态。

当咱们把修改的readme.txt和新建的b.txt添加到暂存区的时候

use "git reset HEAD <file>..." to unstage 意思是git reset HEAD <file> 能够把暂存区中的修改撤消掉,就是你git add <file> 后就后悔了,发现你其实不想添加文件到暂存区,就能够用这个命令,原理是让当前分支对应的内容,覆盖掉暂存区的内容,这样就至关于咱们没有提交 大概意思是除了存在未跟踪的文件外,未添加任何提交 ,说明暂存区是空的,告诉咱们能够用git add <file> 跟踪文件 這意味著你有一個乾淨的工做目錄——換句話說,已追蹤的檔案沒有被修改; Git 也沒有看到任何未追蹤檔案,否則它們會在這裡被列出來; b.txt同時被列在已預存「及」未預存。 這怎麼可能? 原來 Git 在你執行 git add 命令時,的確將當時的檔案內容預存起來; 若是你現在提交,最後一次執行 git add 命令時,那個當下的 b.txt 的版本會被提交,而不是在提交時你在工做目錄所看到的檔案版本被提交; 若是你在 git add 後修改檔案,你必需再次執行 git add 預存最新版的檔案:

簡潔的狀態輸出

雖然 git status 輸出內容相當全面,但也相當囉嗦; Git 另外提供一個簡潔輸出的選項,所以你能够以一種較精簡的方式來檢視你的修改; 若是你執行 git status -s 或 git status --short,你能够從該命令获得一個相當簡單的輸出內容:

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

未追蹤的新檔案在開頭被標示為 ??、被加入預存區的新檔案被標為 A、已修改檔案則是 M 等等。 標記有二個欄位——左邊欄位用來指示「預存區」狀態,右邊欄位則是「工做目錄」狀態。 因此在這個範例中,在工做目錄中的檔案 README 是已修改的,但还没有被預存;而 lib/simplegit.rb 檔案則是已修改且已預存的; Rakefile 則是曾經修改過也預存過,但之後又再次修改,因此總共有二次修改,一個有預存一個沒有。

git diff 会对比【工做目录】和【暂存区】间的内容,,而后将【工做目录】已修改但未存入【暂存区】的内容展现出来

git diff --staged会对比【暂存区】和版本库中最新的一个版本,即最后一次commit上去的内容,把【暂存区】和【版本库】的差别展现出来,若是同样,无返回(--staged和--cached是一回事)

对比的是已追踪的文件

git commit -a -m "注释" Git 在提交前自動預存全部已追蹤的檔案,讓你略過 git add 步驟(前提是文件已被追踪) 在提交以前,你並不须要執行 git add 來預存 b.txt 檔案; 那是因為 -a 選項會納入全部已變更的檔案; 很方便,但請当心,有時候它會納入你並不想要的變更。

image

若是将【工做目录】即电脑本地的文件删除(rm <file>),git status会显示:有变动但未添加到【暂存区】,暂存区有而工做目录没有 若是接下来执行 git rm,【暂存区】会记录该档案的移除动做 另外一個有用的技巧是保留工做目錄的檔案,但將它從預存區中移除; 換句話說,你或許想保留在磁碟機上的檔案但不但愿 Git 再繼續追蹤它; 當你忘記將某些檔案加到 .gitignore 中并且不当心預存它的時候會特別用有,像是不当心預存了一個大的日誌檔案或者一堆 .a 已編譯檔案。 加上 --cached 選項可作到這件事:

git rm --cached

git rm --cached 只删除暂存区的文件,rm 只删除工做目录的文件,git rm 工做目录和暂存区的文件都删除

git mv b.txt bb.txt 可给文件改名

git add -A 和 git add . 的区别
  • git add . :他会监控工做区的状态树,使用它会把工做时的全部变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
  • git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
  • git add -A :是上面两个功能的合集(git add --all的缩写)

参考 参考二 参考三 参考四