Git倉庫
1.創建git倉庫
(1)git init:在現有目錄下初始化倉庫,再通過git add實現對指定文件對追蹤;
(2)git clone url:克隆現有的倉庫—自動在當前目錄下創建目錄且初始化一個.git文件夾,然后將從遠程倉庫拉取下的數據放進.git文件夾,然后將最新版本的文件拷貝進工作目錄;
-
git倉庫的工作區
git項目的三個工作區域
(1)工作目錄
- 已跟蹤文件:從Git倉庫提取出文件,以供修改或使用;可通過git rm --cached xx不再跟蹤xx文件,但xx文件仍存在在本地目錄中,只是不納入版本控制;
- 未跟蹤文件:可通過git add將其變為已跟蹤文件;
(2)暫存區:通過git add將已修改/未跟蹤的文件從工作目錄放入暫存區;
(3)Git倉庫:對暫存區的文件使用git commit,提交修改,保存最新版本的文件快照;
Git常見命令
1.git status [-s]
- git add xx
- 開始跟蹤新文件xx;
- 將已跟蹤的修改過的文件xx放入暫存區;
- 將合并時發送沖突的文件標記為已解決狀態;
3.git commit
(1)git commit -m ‘xx’
(1)git commit -a -m 'xx':相當于git add .+ git commit
撤銷&回滾
1.撤銷文件的修改
(1)git checkout -- <file> :撤銷對文件的修改— 將修改前的file文件覆蓋了該file,此file的任何修改將會消失;
(2)git reset HEAD <file>:撤銷暫存區的文件,取消該文件的git add操作;
2.已commit但未push到遠端
(1)git commit --amend [-m 'xxx']:將這次commit與上一次commit合為一個新的commit,即commit版本號會改變,但commit次數不變;
- 提交新的修改但不增加一條新的commit記錄;
- 只單純更改commit的提交信息,若不寫則默認使用上次的提交信息;
(2)git reset --xx <commit-id / HEAD~n>:回退到commit-id版本/回退n個版本
-
git reset --soft <commit-id / HEAD~n>:回退到指定版本的commit狀態,但保留了所有階段的git add操作;
解決提交分支錯誤的問題 - git reset --mixed <commit-id / HEAD~n>: 回退到指定版本的commit狀態,但工作目錄保留了修改,將目錄中所有的修改通過git add即與--soft的指令結果一樣
- git reset --hard <commit-id / HEAD~n>:回退到指定版本的commit狀態,不保留修改,可通過git reflog找到丟失的commit找回丟失的數據
3.commit之后已push到了遠端:git revert
遠程倉庫&分支
1.git remote:查看遠程倉庫—列出每一個遠程倉庫的簡寫;
(1)git remote -v:顯示簡寫+對應的url;
(2)git remote add <shortname> <url>:添加一個遠程倉庫,并為其指定一個簡寫;
(3)git remote show <shortname>:查看該shortname對應的遠程倉庫的相關信息;
(4)git remote rename x1 x2:將簡寫名x1改為x2;
(5)git remote rm xx:移除簡寫名xx對應的遠程倉庫;
2.遠程分支:(remote)/(branch) — 只要不與遠程倉庫的服務器連接,本地的遠程分支指針就不會移動;
3.拉取:本地倉庫會自動跟蹤對應的遠程分支
(1)git fetch 遠程倉庫:從指定遠程倉庫中拉取本地沒有的數據,但不會合并到本地分支上;
(2)git pull [遠程倉庫 遠程分支]:git fetch+git merge — 查找當前分支所跟蹤的服務器分支,從服務器抓取數據然后合并到本地分支;
(3)git pull --rebase [遠程倉庫 遠程分支]:git fetch+git rebase;
[git pull & git pull --rebase]https://www.cnblogs.com/kevingrace/p/5896706.html
4.推送:git push 遠程倉庫 本地分支:遠程分支
5.跟蹤遠程分支:git checkout -b 分支名 [remote/branch]:將遠程倉庫的分支拉取到本地分支,并建立跟蹤連接—即在該跟蹤分支上輸入git pull,git能自動識別去哪個服務器上抓取,合并到哪個分支;
6.刪除遠程分支:git push 遠程倉庫 --delete 分支名 — 刪除遠程倉庫指定的遠程分支;
git分支
1.創建分支
(1)git branch <分支名>:只是新建分支,但不切換分支;
(2)git checkout -b <分支名>:新建并切換到該分支上;
2.分支切換:git checkout <分支名>—HEAD指針指向當前所在分支,其隨著commit操作自動向前移動,切換分支即切換工作目錄;
3.分支的合并
(1)git merge <分支名>:將指定的分支合并到所在分支上;
-
合并沖突:兩個分支對同一文件的同一部分進行了不同的修改則會產生沖突;
- 需要手動去解決沖突,選擇要保留的最終內容;
- git add將其標記為沖突已解決;
-
git commit完成合并提交;
目前三個分支
合并操作無需解決的分歧稱為“快進“,直接指針向前移動
mater與iss53有分叉,就會新建一個節點作為合并提交
(2)git rebase
-
合并沖突
- 手動解決沖突+git add <沖突文件>+git rebase --continue:先處理沖突再繼續合并;
- 跳過:git rebase --skip
-
取消合并:git rebase --abort
將issue分支合并到master,最后相當于快進合并
(3)git cherry-pick <commit-id>:選擇某個分支的一個或幾個commit進行操作;
- 應用場合
- 把弄錯分支的提交移動到正確的地方;
- 把其他分支的提交添加到現在的分支;
- git cherry-pick <start-commit-id>...<end-commit-id>:一次性將一個連續的時間序列內的commit進行cherry-pick操作—不包含start-commit-id的commit;
- git cherry-pick <start-commit-id>^...<end-commit-id>:[左閉,右閉]的區間,即包含了start-commit和end-commit;
- 合并沖突:手動修改沖突 + git add .+git cherry-pick --continue;
(4)區別:比如兩個抽屜A與B都裝滿了衣服,現在想把B中的衣服裝入A中,則git merge是強制性的,拿起B就倒入A里,如滿了(沖突)再一并整理;而git rebase是一件一件根據一開始放入的順序從B往A中加,如滿了(沖突)你可以選擇處理這一件再繼續加,或跳過這一件,或不再加了把A還原;
3.分支操作
(1)git branch:查看本地git倉庫已有的分支名+所在分支;
(2)git branch -d 分支名:刪除本地分支
(3)git branch -vv:查看所有本地分支&本地分支與遠程分支的關系