1. 程式人生 > 其它 >Git 傻瓜式教程

Git 傻瓜式教程

參考
參考

Git 使用新手入門

1.1 Git 是什麼

世界上最吊的 分散式 版本控制 系統

簡單說就是把程式碼克隆到本地倉庫,輸出到工作區
工作區在暫存區完成後,傳送到本地倉庫,推進到工作區(gitee/github)

Git和SVN做對比,優點是不用聯網

安裝過程非常簡單,需要注意的是要設定名字和郵箱,並牢記:

git config --global user.name "xxx"
git config --global user.email "[email protected]"

1.2 建立倉庫(版本庫)

下面的程式碼塊實現在D盤下目錄新增倉庫,最後一行是把目錄變成git倉庫

cd D:
cd www
mkdir testgit 
cd testgit
pwd
git init

可以去此電腦檢視一下,會多出一個.git檔案
1.3 把檔案新增到版本庫

所有類似Git這種東西,都可以跟蹤文字檔案的改動,例如txt html java css ...
二進位制檔案則不行,圖片視訊這種。

演示:

  • 在倉庫目錄新建檔案:readme.txt 內容:11111111
  • 用命令 git add readme.txt 新增到暫存區中(index)
git add readme.txt
  • 用命令git commit 告訴Git,把檔案提交到暫存區
git commit -m 'readme.txt提交'
  • 用命令git status 檢視是否有檔案未提交
git status

顯示 nothing......就是都提交完了

返回文字檔案繼續改readme.txt內容,新增一行22222222,用git status 再看看結果

git status

如果爆紅,就是已經修改
會有英語提示,意思是已經修改,未提交

用命令git diff readme.txt看一下新增22222222的過程

git diff readme.txt

大概就表達加了一行22222222的意思,用英語

看到已經改了,開始從暫存區提交到倉庫git add git commit ,用git status檢查下,
檢查兩次,第一次err,第二次ok

git add readme.txt
git status
git commit -m "檔案新增22222222內容"
git status

1.4 版本回退

在readme.txt上加一行33333333
再重複上面操作,然後git.log檢視歷史記錄

git add readme.txt
git commit -m "新增readme.txt檔案內容為33333333"
git log -pretty=oneline

然後進行版本回退操作,當前版本回退到上一個版本,有兩種命令

git reset --hard HEAD^ 
# 33333333沒有了
# 上上個版本HEAD^^
# 或者
git reset --hard HEAD~100 
# 回退100個版本

我們又想恢復 33333333

git reflog 
# 這一步是看一下歷史記錄,commit的中文說明
# 最左邊的就是版本號,然後用命令恢復
git reset --hard xxx版本號xxx

1.5 理解工作區和暫存區的區別
工作區:電腦上看到的目錄
倉庫: .git 隱藏目錄,這個是版本庫,也叫倉庫,repository,版本庫中有stage(暫存區),Git建立了一個分支master,指向master的指標HEAD
Git提交檔案到版本庫有兩步:

  • git add 檔案,解讀:把檔案提交到暫存區
  • git commit 提交,把暫存區檔案提交到倉庫 分支

下面進行實現這兩步:
把readme.txt 新增44444444,建立一個test.txt
git add 檔案
git commit 檔案
顯示nothing就是成功

git status
git add readme.txt 
git add test.txt
git status
git commit -m "一次性提交所有檔案,包括新建檔案test.txt"
git statusgit status

1.6 撤銷修改和刪除檔案操作

在readme.txt增加一行55555555,然後撤銷這個操作

  • 直接手動修改,然後add commit
  • 返回上一個版本 reset
  • git checkout -- readme.txt 確保沒有commit
  • rm xxx 刪除檔案

下面實現一下:
新增a.txt , 新增到快取區,刪除a.txt,撤銷刪除操作,提交

cd
git add a.txt
git status
rm a.txt
git status
git checkout -- a.txt
git status

1.7 遠端倉庫

註冊gitee帳號,由於本地倉庫和gitee倉庫之間傳輸SSH加密

  1. 建立SSH key ,在主目錄下,看看有沒有.ssh目錄,如果有看看有沒有id_rsa和id_rsa.pub這兩個檔案,有就跳過,沒有建立一個
ssh-keygen -t rsa -C "[email protected]"

id_rsa 是私鑰不能洩漏,id_rsa.pub是公鑰,這個隨便搞

  1. 登入gitee,開啟settings中的ssh 公鑰頁面,點選add ssh key,填上任意title,在key文字框貼上id_rsa.pub公鑰內容

點選確定

  1. 新增遠端倉庫,在gitee頁面下新增即可,然後把本地倉庫和遠端倉庫關聯,推送即可
git remote add origin https://gitee.com/xx/xx.git
git push -u origin master
# 把本地倉庫分支master內容推送到遠端倉庫

只要本地作了提交,就可以通過以下命令:
git push origin master 把本地分支推送到gitee上,就擁有了真正的 分散式版本庫
git push origin master 報錯,推送失敗:
error: failed to push some refs to 'https://gitee.com/fu-guangjian/test-git.git'
解決方法

  1. 從遠端庫克隆
    git clone https://gitee.com/xx/xx
    看一下本地生成xx倉庫目錄了

簡易的命令列入門教程:
Git 全域性設定:

git config --global user.name "fuguangjian"
git config --global user.email "[email protected]"
建立 git 倉庫:

mkdir test-git
cd test-git
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/fu-guangjian/test-git.git
git push -u origin "master"
已有倉庫?

cd existing_git_repo
git remote add origin https://gitee.com/fu-guangjian/test-git.git
git push -u origin "master"


1.8 建立與合併分支
版本回退中,每次提交,git把他們串成一條線,這條線就是分支,在Git中,這個分支是主分支,即master分支,HEAD -> master -> 提交
首先建立並切換dev分支

git checkout -b fufufu
# git checkout -b xx 是建立並切換 
# 相當於git branch dev + git checkout dev
git branch
# 檢視當前分支,應該是一個 master

新增一行55555555,然後cat看一下,commit提交一下,再切換到主分支master,看到readme.txt並沒有55555555,這是因為dev分支內容沒有合併到master上,git merge dev
合併,他的作用是合併指定分支到當前分支,就可以了,可以cat看下,合併後可以刪除
dev分支了

cat readme.txt
git add readme.txt
git commit -m "dev分支增加內容55555555"
git checkout master
git merge fufufu
cat readme.txt
git branch -d fufufu
git branch

1.9 解決衝突
隨便新建一個分支,加66666666
切換到master,加77777777
合併分支,出現了衝突:<<<<<<<,=======,>>>>>>>
要修改成主幹內容,以主幹為主


常用命令彙總:

一、新建程式碼庫

# 在當前目錄新建一個Git程式碼庫
$ git init

# 新建一個目錄,將其初始化為Git程式碼庫
$ git init [project-name] # 下載一個專案和它的整個程式碼歷史
$ git clone [url]

二、配置
# 顯示當前的Git配置
$ git config --list

# 編輯Git配置檔案
$ git config -e [--global] # 設定提交程式碼時的使用者資訊
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

三、增加/刪除檔案
# 新增指定檔案到暫存區
$ git add [file1] [file2] ... # 新增指定目錄到暫存區,包括子目錄
$ git add [dir] # 添加當前目錄的所有檔案到暫存區
$ git add . # 新增每個變化前,都會要求確認 # 對於同一個檔案的多處變化,可以實現分次提交
$ git add -p

# 刪除工作區檔案,並且將這次刪除放入暫存區
$ git rm [file1] [file2] ... # 停止追蹤指定檔案,但該檔案會保留在工作區
$ git rm --cached [file] # 改名檔案,並且將這個改名放入暫存區
$ git mv [file-original] [file-renamed]

四、程式碼提交
# 提交暫存區到倉庫區
$ git commit -m [message] # 提交暫存區的指定檔案到倉庫區
$ git commit [file1] [file2] ... -m [message] # 提交工作區自上次commit之後的變化,直接到倉庫區
$ git commit -a

# 提交時顯示所有diff資訊
$ git commit -v

# 使用一次新的commit,替代上一次提交 # 如果程式碼沒有任何新變化,則用來改寫上一次commit的提交資訊
$ git commit --amend -m [message] # 重做上一次commit,幷包括指定檔案的新變化
$ git commit --amend [file1] [file2] ...

五、分支
# 列出所有本地分支
$ git branch

# 列出所有遠端分支
$ git branch -r

# 列出所有本地分支和遠端分支
$ git branch -a

# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name] # 新建一個分支,並切換到該分支
$ git checkout -b [branch] # 新建一個分支,指向指定commit
$ git branch [branch] [commit] # 新建一個分支,與指定的遠端分支建立追蹤關係
$ git branch --track [branch] [remote-branch] # 切換到指定分支,並更新工作區
$ git checkout [branch-name] # 切換到上一個分支
$ git checkout - # 建立追蹤關係,在現有分支與指定的遠端分支之間
$ git branch --set-upstream [branch] [remote-branch] # 合併指定分支到當前分支
$ git merge [branch] # 選擇一個commit,合併進當前分支
$ git cherry-pick [commit] # 刪除分支
$ git branch -d [branch-name] # 刪除遠端分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

六、標籤
# 列出所有tag
$ git tag

# 新建一個tag在當前commit
$ git tag [tag] # 新建一個tag在指定commit
$ git tag [tag] [commit] # 刪除本地tag
$ git tag -d [tag] # 刪除遠端tag
$ git push origin :refs/tags/[tagName] # 檢視tag資訊
$ git show [tag] # 提交指定tag
$ git push [remote] [tag] # 提交所有tag
$ git push [remote] --tags

# 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]

七、檢視資訊
# 顯示有變更的檔案
$ git status

# 顯示當前分支的版本歷史
$ git log

# 顯示commit歷史,以及每次commit發生變更的檔案
$ git log --stat

# 搜尋提交歷史,根據關鍵詞
$ git log -S [keyword] # 顯示某個commit之後的所有變動,每個commit佔據一行
$ git log [tag] HEAD --pretty=format:%s

# 顯示某個commit之後的所有變動,其"提交說明"必須符合搜尋條件
$ git log [tag] HEAD --grep feature

# 顯示某個檔案的版本歷史,包括檔案改名
$ git log --follow [file]
$ git whatchanged [file] # 顯示指定檔案相關的每一次diff
$ git log -p [file] # 顯示過去5次提交
$ git log -5 --pretty --oneline

# 顯示所有提交過的使用者,按提交次數排序
$ git shortlog -sn

# 顯示指定檔案是什麼人在什麼時間修改過
$ git blame [file] # 顯示暫存區和工作區的差異
$ git diff

# 顯示暫存區和上一個commit的差異
$ git diff --cached [file] # 顯示工作區與當前分支最新commit之間的差異
$ git diff HEAD

# 顯示兩次提交之間的差異
$ git diff [first-branch]...[second-branch] # 顯示今天你寫了多少行程式碼
$ git diff --shortstat "@{0 day ago}" # 顯示某次提交的元資料和內容變化
$ git show [commit] # 顯示某次提交發生變化的檔案
$ git show --name-only [commit] # 顯示某次提交時,某個檔案的內容
$ git show [commit]:[filename] # 顯示當前分支的最近幾次提交
$ git reflog

八、遠端同步
# 下載遠端倉庫的所有變動
$ git fetch [remote] # 顯示所有遠端倉庫
$ git remote -v

# 顯示某個遠端倉庫的資訊
$ git remote show [remote] # 增加一個新的遠端倉庫,並命名
$ git remote add [shortname] [url] # 取回遠端倉庫的變化,並與本地分支合併
$ git pull [remote] [branch] # 上傳本地指定分支到遠端倉庫
$ git push [remote] [branch] # 強行推送當前分支到遠端倉庫,即使有衝突
$ git push [remote] --force

# 推送所有分支到遠端倉庫
$ git push [remote] --all

九、撤銷
# 恢復暫存區的指定檔案到工作區
$ git checkout [file] # 恢復某個commit的指定檔案到暫存區和工作區
$ git checkout [commit] [file] # 恢復暫存區的所有檔案到工作區
$ git checkout . # 重置暫存區的指定檔案,與上一次commit保持一致,但工作區不變
$ git reset [file] # 重置暫存區與工作區,與上一次commit保持一致
$ git reset --hard

# 重置當前分支的指標為指定commit,同時重置暫存區,但工作區不變
$ git reset [commit] # 重置當前分支的HEAD為指定commit,同時重置暫存區和工作區,與指定commit一致
$ git reset --hard [commit] # 重置當前HEAD為指定commit,但保持暫存區和工作區不變
$ git reset --keep [commit] # 新建一個commit,用來撤銷指定commit # 後者的所有變化都將被前者抵消,並且應用到當前分支
$ git revert [commit] # 暫時將未提交的變化移除,稍後再移入
$ git stash
$ git stash pop