Mac~git学习和应用需要注意的几个点
Git學習推薦網站:廖雪峰-Git教程 - 廖雪峰的官方網站,通俗易懂,簡單粗暴,就是平俗的語言,好懂、粗暴的那種
git學習進階~國外經典git學習網站:Git - Book
目錄
1. 全局配置和單個項目倉庫的用戶名郵箱配置
2. git diff命令
3. git add 和 git commit命令
4. 版本回退命令
5. 文件刪除rm
6.?添加遠程庫
7.?刪除遠程庫
8. 兩種創建版本庫方式
9. 更新本地版本庫
10. git忽略文件
11. 修改和合并多條commit信息
12. 分支管理
1. 全局配置和單個項目倉庫的用戶名郵箱配置
如果你配置的全局的用戶名和郵箱是公司的,而自己也有私人用戶名和郵箱來開發自己項目,這樣可能一臺電腦需要設置多個git用戶名配置的項目。如果你不進行配置用戶名和郵箱的話, 則會使用全局的, 這個時候是錯誤的, 正確的做法是針對個人的項目, 在自己的項目根目錄下進行單獨配置
-
全局配置
-
目前大部分公司都已經使用gitlab或github管理項目代碼, 在使用git時相信大家都配置了一個全局的用戶名和郵箱
- 非公司或非個人的單個項目?
如果你配置的全局的用戶名和郵箱是公司的,而自己也有私人用戶名和郵箱來開發自己項目,這樣可能一臺電腦需要設置多個git用戶名配置的項目。如果你不進行配置用戶名和郵箱的話, 則會使用全局的, 這個時候是錯誤的, 正確的做法是針對個人的項目, 在自己的項目根目錄下進行單獨配置
$ git config user.name "mygitlab Name"$ git config user.email "mygitlab@xx.com"$ git config --listgit config --list查看當前配置, 在當前項目下面查看的配置是全局配置+當前項目的配置, 使用的時候會優先使用當前項目的配置
參考原文:https://blog.csdn.net/hyupeng1006/article/details/116154080
- 刪除單個項目的用戶郵箱參數,恢復使用全局配置
由于每個git項目下都會有一個隱藏的.git文件夾 ,將終端的工作目錄設置到,相應的項目根目錄下,執行ls -all命令,顯示所有文件,即可看到.git的隱藏文件夾。通過cd .git 進入該目錄,發現該目錄下有個config文件,采用open config 命令打開,刪除個人參數即可:
[user]name = XXX(自己的名稱英文)email = XXXX(郵箱)保存,command+s 即可。
2. git diff命令
git diff顧名思義就是查看difference,知道了對readme.txt作了什么,這一步查看是在git add xx.file之前,再把它提交到倉庫就放心多了
3. git add 和 git commit命令
commit而不是add在git中類似于保存,版本回退就是基于commit保存機制進行的,比如:git reset --hard HEAD(表示當前版本)/HEAD^(表示上一個版本)、--hard commit_id。
git add 文件夾???~git添加整個文件夾及內容
git add -A?提交所有變化
git add -u 提交被修改(modified)和被刪除(deleted)文件,不包括新文件(new)
git add . 提交新文件(new)和被修改(modified)文件,不包括被刪除(deleted)文件
git add . 會把本地所有untrack的文件都加入暫存區,并且會根據.gitignore做過濾,但是git add * 會忽略.gitignore把任何文件都加入
4. 版本回退命令
- 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。在git add file之前
- 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操作。在git add之后,在git commit之前
- 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,git reset --hard HEAD^,不過前提是沒有推送到遠程庫。在git commit之后,在git push之前
- git reflog記錄你的git命令,用來尋找回退以前的版本
-->從暫存區恢復工作區,git resotre --worktree readme.txt
-->從master恢復暫存區,git restore --staged readme.txt
-->從master同時恢復工作區和暫存區,git restore --source=HEAD --staged --worktree readme.txt
5. 文件刪除rm
$ rm test.txt rm也算一種修改,提交使用git rm而不是git add $ git rm test.txt $ git commit -m "remove test.txt" git checkout -- test.txt git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。?注意:從來沒有被添加到版本庫就被刪除的文件,是無法恢復的!
6.?添加遠程庫
-
首先,登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫:
- 關聯本地版本庫與遠程版本庫。
- 推送上去。把本地庫的內容推送到遠程
-->我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。
--> 強制推送:git push --force 或 git push -f origin master
7.?刪除遠程庫
此處的“刪除”其實是解除了本地和遠程的綁定關系,并不是物理上刪除了遠程庫。遠程庫本身并沒有任何改動。要真正刪除遠程庫,需要登錄到GitHub,在后臺頁面找到刪除按鈕再刪除。
如果添加的時候地址寫錯了,或者就是想刪除遠程庫,可以用git remote rm <name>命令。使用前,建議先用git remote -v查看遠程庫信息:
$ git remote -v origin git@github.com:michaelliao/learn-git.git (fetch) origin git@github.com:michaelliao/learn-git.git (push)然后,根據名字刪除,比如刪除origin:
$ git remote rm origin8. 兩種創建版本庫方式
- 先創建本地版本庫再推送遠程版本庫,git init --> git push
- 先創建遠程版本庫再克隆到本地文件夾,git clone
9. 更新本地版本庫
git分布式系統的目的就是合作,如果其他人的進度比你快,并且提交了好幾次commit to remote repository,現在remote repository的版本領先你本地的版本庫了,腫么辦?-->更新本地庫
- 先用git fetch到remote repository中獲取遠程倉庫狀態和數據更新,獲取你本地倉庫還沒有的數據
- 然后git merge與本地倉庫合并。雖然一般都是合并master,但也可以指定合并分支 <遠程repo> <本地repo>:<本地分支>
另一種方法是git pull=git fetch + git merge,它比較簡單粗暴,直接硬合并,你無法看到通過git fetch得到的狀態更新數據。
--> 怎么git push origin master不好使,git push才行? --未解答
-->git fetch和git pull區別:
Git fetch和git pull區別為:遠端跟蹤分支不同、拉取不同、commitID不同。
一、遠端跟蹤分支不同
1、Git fetch:Git fetch能夠直接更改遠端跟蹤分支。
2、git pull:git pull無法直接對遠程跟蹤分支操作,我們必須先切回本地分支然后創建一個新的commit提交。
二、拉取不同
1、Git fetch:Git fetch會將數據拉取到本地倉庫 - 它并不會自動合并或修改當前的工作。
2、git pull:git pull是從遠程獲取最新版本并merge到本地,會自動合并或修改當前的工作。
三、commitID不同
1、Git fetch:使用Git?fetch更新代碼,本地的庫中master的commitID不變,還是等于1。
2、git pull:使用git pull更新代碼,本地的庫中master的commitID發生改變,變成了2。
--> 最麻煩的問題:你本地執行了修改操作并commit,遠程倉庫也被其他人執行了好幾次commit操作,造成無法合并的路徑、版本沖突了,即both modified same-file,你不能git push、pull或者git merge最新的遠程版本庫
Your branch and 'origin/main' have diverged, and have 1 and 2 different commits each, respectively.(use "git pull" to merge the remote branch into yours)You have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Unmerged paths:(use "git add <file>..." to mark resolution)both modified: README.md解決方法:
- 一種方法是手動修改Git合并失敗的文件為我們希望的內容,再提交
- 還有一種方法是拋棄本庫對沖突文件的修改,全部替換為remote repository文件的內容。
10. git忽略文件
- 全局范圍內有效的忽略文件
就是"版本庫根目錄/.git/info/exclude",全局范圍內的所有忽略規則都以行為單位寫在這個文件中;
- 局部范圍內有效的忽略文件
就是.gitignore,這個忽略文件只對某一級目錄下的文件的忽略有效;
如果某一個目錄下有需要被忽略的文件,那么就可以在該目錄下手工地創建忽略文件.gitignore,并在這個忽略文件中寫上忽略規則,以行為單位,一條規則占據一行;
忽略配置語法:
以斜杠“/”開頭表示目錄;
以星號“*”通配多個字符;
以問號“?”通配單個字符
以方括號“[]”包含單個字符的匹配列表;
以嘆號“!”表示不忽略(跟蹤)匹配到的文件或目錄;
忽略示例:
(1)規則:fd1/*
說明:忽略目錄 fd1 下的全部內容;注意,不管是根目錄下的 /fd1/ 目錄,還是某個子目錄 /child/fd1/ 目錄,都會被忽略;
(2)規則:/fd1/*
說明:忽略根目錄下的 /fd1/ 目錄的全部內容;
(3)規則:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
說明:忽略全部內容,但是不忽略 .gitignore 文件、根目錄下的 /fw/bin/ 和 /fw/sf/ 目錄;
(4).idea //忽略.idea文件夾及文件夾下文件
*.iml //忽略以.iml結尾的文件
參考:Baby小豬,https://www.jianshu.com/p/62a412b7a6e8;git設置忽略文件和目錄 - wangmo - 博客園
11. 修改和合并多條commit信息
背景:Git項目,對同一個功能不斷改進、多次遠程提交生成commit記錄的情況,不利于觀看。
目的:為了保證一個功能點只有一條提交記錄利于后續維護,需要利用git rebase命令對屬于同一功能點的多條commit記錄進行合并。
rebase:需要準備理解rebase的含義!!rebase的含義其實包括選基(rebase commit_id)和合并(pick,squash,fixup commit)兩步,雖然選基和合并都遵循“前一步原則”,但rebase的commit_id和pick的commit_id絕對不一樣!!
rebase的commit_id是要選擇幾個commits并入的那個commit_id的前一個commit_id;而幾條commit_id要并入的那個commit_id是在vim里面的前一條id,用pick標記。即rebase選擇的commit_id是所有操作commit_id的基,并不參與任何操作或者并入,比如說commit1、2、3、4,我打算將commit1、2并入commit3,那rebase選擇的commit_id是4,commit1、2、3都在vim里面操作!
?具體案例步驟參考:
————————————————
版權聲明:本文為CSDN博主「書憶江南」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33588730/article/details/110230039
(1)?確定此次合并基于的base記錄
既然要合并“Support”那一條與它上面三條的總共四次commit記錄,就要以“Support”那條第一次提交記錄的再下面那條“Merge branch”記錄,作為本次合并的base記錄。這點容易理解,就像造房子需要在地基之上建,第一次提交記錄的再之前一次記錄就是本次“地基”。因此輸入以下命令開始此次記錄合并,commit id就是選取的base記錄的id:
git rebase -i 4560d5dd728c627291201eb8c04041628de7d5e4(2)?合并多個commit id
使用git rebase -i命令后,會進入Git內置的vim界面,如下圖所示:
vim操作: i--輸入模式;esc--證明模式;shift+: +wq--保存退出
commit_id操作命令:reword-編輯commit信息;squash-將commit并入前一個commit中,并保留commit信息;fixup-將commit并入前一個commit中,不保留commit信息等。
--> 單純地只編輯上一條寫錯的commit message不合并多個commit信息,可以用:git commit --amend
這四次提交涉及的代碼改動都是需要的,但是只需要一條提交記錄,因此先按“i”鍵進入INSERT模式,將后三次commit id前面的“pick”字樣改為“s”(我個人用的是f),只有第一次的commit id前面是“pick”,然后按ESC鍵退出編輯模式,并輸入:wq進行保存。注意如果是在Intellij IDEA的Terminal框里編輯rebase信息,那么在按ESC之后光標會回到代碼區,此時輸入的“:wq”會寫到代碼里,所以這種情況下按ESC鍵之后,要重新用鼠標點一下Terminal框里的區域,重新把光標定位回Terminal框中。
(3)?去除多余的commit描述
在上一個pick與squash編輯界面用:wq保存后,會跳出最后的commit描述編輯界面,如下圖所示
這里按“i”鍵進入INSERT模式后,可以把不需要的后三條commit描述用“#”號注釋掉,只留下第一次提交時那條藍色高亮的“Support”描述,然后用ESC鍵退出編輯模式,再輸入:wq進行保存。
(4) 完成rebase
在vim里面的commit操作結束之后,還要繼續完成rebase操作,git有三個rebase繼續命令:continue、skip、abort
git rebase --continue #表示合并順利,可以繼續完成rebase git rebase --skip #表示rebase過程遇到沖突,是否要跳過不能合并的沖突 git rebase --abort #表示rebase合并出錯,我要放棄這次rebase操作rebase過程遇到沖突很常見,尤其是本地不同commit版本提交過程產生的沖突,我個人強烈不建議用skip跳過。
--> vi xx.file打開沖突文件,手工修改沖突,然后git add xx.file(表示沖突文件已經手工修改完畢),這時絕不要git commit!!最后,執行git rebase --continue完成rebase操作
在rebase過程中,最好每一步用git status觀察rebase狀態,輸入合適的命令
(5)?遠程強制提交
強制提交原因:因為合并多個commit后,本地版本庫因為少了幾個commits,會與遠程庫產生different commits沖突,git會建議你用git pull解決本地庫與遠程庫different commits沖突,絕不!!
絕不能辛辛苦苦二十年,一朝回到解放前,你git pull了之后,本地庫又會被遠程庫同化為原來的多個commit信息。所以必須在rebase完成后,強制push。
在命令行輸入以下命令即可:git push -f origin 分支名 或 git push --force,將遠程庫的commit記錄強制同化為本地庫的commit記錄。
如果本地分支與遠程分支關聯過,那么其中“origin 分支名”部分可以省略,強制提交后可以看到GitLab上關于該功能點只有一條commit記錄了。
12. 分支管理
Git分支:Git把每次提交(commit)串成一條時間線,這條時間線就是一個分支。
- 主分支-master分支:master分支的master指針,用master指針指過的提交(commit)串成一條時間線。
- 指針-HEAD,指向當前分支指針,默認是master分支的master指針。
e.g. 一開始的時候,git用master指針指向最新的提交,再用HEAD指針指向master指針,這樣就能確定當前分支,以及當前分支的提交點。
(1)創建分支
創建分支是在當前提交上新建一個分支指針dev,再把HEAD指針指向dev指針,這就表示當前分支在dev上。
git checkout -b dev # 創建并切換到dev分支 =git branch dev # 創建分支git checkout dev # 切換到分支dev或者用switch創建并切換到dev分支
git switch -c dev(2) 查看分支
git branch*表示當前分支(3)切換分支
git checkout master或git switch master(4)合并分支
git checkout master git merge dev(5) 刪除分支
git branck -d dev總結
以上是生活随笔為你收集整理的Mac~git学习和应用需要注意的几个点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程基础(四):编程习惯、代
- 下一篇: Mac~Terminal终端操作命令、v