git的學習筆記(一):git本地操做

1.Git介紹

  • Git是一個開源的分佈式版本控制軟件,用以有效、高速的處理從很小到很是大的項目版本管理。
  • Git 最初是由Linus Torvalds設計開發的,用於管理Linux內核開發。
  • Git 是根據GNU的GPL(通用公共許可證)V2的條款分發的自由/免費軟件,安裝參見:http://git-scm.com/
  • Git自己能夠作到版本控制,但其全部版本記錄只能保存在本機,若是想要將文件內容以及版本記錄同時保存在遠程,則須要結合GitHub來使用。
  • GitHub是一個基於Git的遠程文件託管平臺(同GitCafe、BitBucket和GitLab等)。

集中式版本控制系統與分佈式版本控制系統的區別html

  • 集中式git

    版本庫是集中存放在中央服務器,用戶客戶端只有文件的某個版本.
    須要的時候,用戶先從中央服務器下載最新版本的文件到本地電腦,而後開始修改,修改完成後再把本身修改後的版本推送給中央服務器。
    集中式版本控制系統最大的毛病就是必須聯網才能工做,若是客戶端到中央服務器的網絡很差的時候,就會很影響工做的效率.
  • 分佈式正則表達式

    遠程服務器保存全部版本,用戶客戶端也能夠保存全部版本
    分佈式版本控制系統中每一個人的電腦上都有一個完整的版本庫.須要的時候,能夠不須要聯網,由於版本庫就在你本身的電腦上。
    多人協同工做的時候,一個用戶在本身電腦上改了文件A,另外一我的在他的電腦上改了文件B,工做結束只需把各自的修改推送給對方,就能夠互相看到對方的修改了。shell

2. 配置git的用戶信息

git config --global user.name 'your_name'
git config --global user.email 'your_email'

git config的三個做用域vim

缺省等同於local緩存

git config --local          # 只對某個git倉庫有效
git config --global         # global對當前用戶全部倉庫有效
git config --system         # system對系統全部登陸的用戶有效

顯示config的配置,加--list服務器

git config --list --local
git config --list --global
git config --list --system

3.git倉庫管理

3.1 初始化git倉庫

1.把已有的項目代碼歸入git管理網絡

cd 項目代碼全部文件夾
git init

2.新建的項目直接用git管理app

cd 某個文件夾
git init your_project       # 會有當前路徑下建立和項目名稱同名的文件夾
cd your_project

3.2 往倉庫裏添加文件

git add files       # 添加文件
git add .           # 把工做區全部文件移動在暫存區
git commit          # 提交信息,加上 -a 選項能夠把暫存區裏的全部文件都進行提交

3.3 文件重命名和刪除

git mv old_file_name new_file_name
git rm file_name

3.4 經過git log查看版本演變歷史

查看版本演變歷史的命令編輯器

git log

可添加的選項:
    --oneline       # 以每一行的方式查看當前分支的全部提交日誌
    --pretty=online # 用commit id(版本號)顯示修改記錄,減小log文件的輸出,使每條記錄只輸出一行
    -n4             # 以每一行的方式查看當前分支最近的4條提交日誌
    --all           # 查看全部分支的提交日誌
    --graph         # 以圖形化方式查看提交日誌

能夠經過gitk圖形界面工具來查看版本歷史

3.5 查看git倉庫的信息

git status                      查看當前git倉庫的狀態
git diff *                      檢查上一次對文件所作的修改內容
git log                         查看版本庫的修改歷史記錄
git reflog                      用來記錄每一次命令(查詢某次修改的版本號)

3.6 git的區域狀態說明

****工做區:****

工做區(word directory)就是在電腦上能看到的目錄
當前開發程序所在的目錄爲工做區,該區域的文件會有狀態變化且狀態由git自動檢測
目錄中的文件的任何變化(增,刪,改),git都會檢測到,可使用git status命令查看

****版本庫:****

版本庫(repository)工做區有一個隱藏目錄.git,保存的就是git的版本庫
工做區檢測到有文件發生變化,那麼意味着文件狀態被改變,這時就能夠當作一個版本進行提交

工做區的代碼經過git add來加入到暫存區,使用git commit命令把暫存區的文件加入到當前分支的(通常爲git自動建立master的分區)

git的版本庫中一個區域,稱之爲stage(或者叫index)的暫存區.
在工做區的文件被修改,使用`git status`查看狀態時,顯示文件的顏色爲紅色
使用`git add`把文件從工做區移到暫存區,再使用`git status`查看狀態時,顯示文件的顏色爲綠色

3.7 git區域操做

git checkout --filename         撤銷工做區的修改,把工做區的文件恢復到暫存區的狀態
    若是文件修改後還未放到暫存區,撤消修改就回到未修改以前的狀態
    若是文件修改後已添加到暫存區,撤消修改就回到添加進暫存區時的狀態
git reset HEAD filename         把暫存區的修改撤消掉,從新放回到工做區,這條命令是在把修改後的文件提交到暫存區以後又後悔了,使文件恢復到版本庫的狀態
git reset HEAD                  取消暫存區全部文件
git reset HEAD -- index.html    把暫存區中的index.html恢復成跟工做區同樣,能夠添加多個文件
git checkout -- index.html      把工做區恢復成和暫存區同樣
git stash                       儲存當前工做現場
git stash list                  查看stash區域的全部信息
git stash apply                 取出stash區域中的文件放到當前工做區,可是文件還保存在stash區域中,能夠反覆使用
git stash drop                  刪除最近一次儲存的stash
git stash pop                   取出stash區域中的文件放到當前工做區中,文件不會繼續保存到stash區域中
git stash stash@{num}           恢復指定stash
  • 注意

    • 若誤刪文件時,使用git checkout --filename 來恢復到未刪除以前的狀態
    • 確實要刪除一個文件,使用git rm filename將其從git版本庫中刪除
    • git checkout和git reset都是在將文件add到暫存區,沒有commit時的撤消修改
    • 若已經將文件從暫存區commit到版本庫而未推送到遠程時,能夠回退到上一個版本
    • 若文件已經被推送到遠程,則沒法撤消

      須要注意的是,git是對文件更改的管理,不是基於文件的管理

4.git分支及合併操做

git branch                                  # 查看當前分支而且看到在哪一個分支下工做
git branch -v                               # 查看本地git分支
git branch -av                              # 查看全部分支及其詳細信息,若是添加遠程倉庫,會顯示遠程倉庫上的分支
git branch dev                              # 建立一個dev分支
git checkout -b dev                         # 建立dev分支並切換到dev分支上工做
git checkout -b temp 5ccb4b3                # 基於5ccb4b3這個版本建立一個temp的分支
git checkout -b branch2 branch1             # 基於branch1分支建立並切換到branch2分支
git checkout dev                            # 切換到dev分支
git checkout master                         # 切換回master分支
git branch -d dev                           # 刪除dev分支,刪除分支時,分支相關的信息也會被刪除
git branch -D branch_name                   # 刪除指定分支,刪除分支時,分支相關的信息也會被刪除
git checkout --*                            # 把文件返回到修改以前的狀態
git merge dev                               # 把dev分支合併到當前分支
git merge --no-ff -m "commit_message" dev   # 不使用fast forward模式合併dev分支到當前分支

須要注意的是:

  • 1.合併分支的時候若是出現衝突,那麼將會出現衝突提醒,此時修改文件,解決衝突後再次提交就能夠了
  • 2.可使用git log或者git log --graph指令來查看分支與分支合併狀況
  • 3.一般在合併分支時,通常都是用fast forward模式,可是不能執行快速合併並且不會起衝突,這時合併以後就會作一次新的提交.
  • 4.當基於某個遠程分支建立並切換到新的分支修改並commit以後,若是要提交到遠程分支時,能夠直接使用 git push 把本地分支的修改同步到遠程倉庫的指定分支(若是不是基於遠程master分支建立則同步到遠程倉庫時也會同步到遠程非master分支)
  • 5.修復bug時,須要新建並切換到bug分支.bug修復並提交後,合併到主分支,而後將臨時bug分支刪除.此時把臨時bug分支快速合併到主分支後,臨時bug分支裏的提交信息就會消失,此時能夠不使用快速合併,使用遞歸合併的方式將臨時bug分支提交到主分支,這樣臨時bug分支裏的提交信息也能夠保留

5.版本回退

git reset --hard HEAD^          回退到上一個版本
git reset --hard HEAD^^         回退到上兩個版本
git reset --hard 123456         回退到版本號爲123456的版本
git reset --hard commit_id^     回退到指定commit_id的版本
  • 注意

    • HEAD^爲上上一個版本,HEAD表示當前版本
    • 使用git reset命令回退後,再使用log命令將只能得到當前HEAD版本以前的版本,此時可使用git reflog找到比當前版本新的版本的commit id就能夠回滾回去了
    • log命令能夠查看提交歷史,reflog能夠查看命令歷史

6.忽略文件的推送

有的時候,提交推送的時候不想提交某些文件,此時能夠在這個項目根目錄下新建一個名爲.gitignore的文件,

在這個文件裏能夠進行配置提交的時候忽略哪些文件,配置使用正則表達式的形式.
好比:

*.py                忽略全部的以py結尾的文件
test/a.*            忽略test目錄下全部的以a開頭的文件
test/[abc].py       忽略test目錄下a.py或b.py或c.py這三個文件
[abc]               忽略根目錄下a或b或c這三個文件
test/*              忽略test目錄下的全部文件
!test/a.py          忽略test目錄下不是a.py之外的全部文件,即只提交a.py這個文件

配置完成後,須要清除本地緩存,而後再次提交.

清除本地緩存的命令:

git rm -f --cached .

7.git diff命令

git diff                                    # 比較工做區和暫存區全部文件的差別
git diff 3c6fab966158f9 72ec71f3c2aa        # 比較兩次提交的差別
git diff HEAD HEAD~1                        # git上一次提交與上上一次提交的差別
git diff HEAD HEAD^1^1                      # git上一次提交與前兩次提交的差別
git diff HEAD HEAD~2                        # git上一次提交與前兩次提交的差別
git diff HEAD HEAD^1                        # git上一次提交與上上一次提交的差別
git diff HEAD HEAD^1 -- index.html          # git上一次提交與上上一次提交中index.html文件的不一樣
git diff -- index.html                      # 比較工做區和暫存區中的index.html文件的差別
git diff --cached                           # 修改文件後,把修改的文件添加到暫存區中,查看暫存區和HEAD文件的差別
git diff master dev                         # 比較master分支和dev分支的差別
git diff master dev -- index.html           # 比較index.html文件在master分支和dev分支的差別

兩個分支的位置不一樣,顯示文件的加減是不一樣的

8.修改提交的commit

git commit --amend                      # 修改最新提交的commit信息

9.git rebase操做

9.1 修改任何commit的message信息的步驟

1.列出全部的提交日誌

git log --oneline               # 每行顯示一條提交記錄
git log --pretty=oneline
gitk                            # 圖形化顯示全部提交記錄

2.進入修改交互模式

git rebase -i 版本號

這裏的版本號爲:要修改提交信息的版本號的上一個版本號。例如:按提交順序從1到6,若是想修改版本4的提交信息,則此處的版本號應該爲第3個版本號
3.進入交互模式後,會有以下提示:

# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

並列出在進入交互式模式時輸入的版本號後的全部提交信息,把想修改的信息以前的pick修改成 r 或者 reword,而後:wq保存並退出

此時會打開想修改的commit的message信息,按vim編輯器的用法修改保存就能夠
4.查看修改以後的commit message

git log --oneline

前提是必需要配置全局用戶名和用戶郵箱

9.2 把連續的多個commit合併成一個commit

1.查看全部提交記錄

git log --oneline

2.進入git交互式模式

git rebase -i 版本號

這裏的版本號爲:要修改提交信息的版本號的上一個版本號。例如:按提交順序從1到6,若是想合併版本4和版本5的提交信息,則此處的版本號應該爲第3個版本號
3.進入交互模式後,會有以下提示:

# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

並列出在進入交互式模式時輸入的版本號後的全部提交信息,把被合併的版本號的commit信息前的pick換成 s 或 squash,而後保存並退出

此時會打開合併後的commit提交信息窗口,按vim編輯器的用法修改保存就能夠

4.查看修改以後的commit message

git log

能夠看到把多個commit合併成一個commit後,全部提交的版本號都改變了

例子:如今有屢次提交的版本號v1,版本號v2,版本號v3,版本號v4,版本號v5,版本號v6,想把v2和v3,v4這三次提交合併成一個新的提交,操做步驟:

git rebase -i v1
在打開的文件中,把v2和v3前面的pick修改爲s,而後保存並退出
在新打開的窗口中,把未註釋的行的內容修改成合併後想要的新內容,而後保存並退出
使用git log命令查看,就能夠看到合併後的提交信息了
相關文章
相關標籤/搜索