git版本控制
引題:随着項目越來越大,出現以下問題:
1.項目本來正确,加了些新功能或改bug,結果不知不覺影響到其他功能導緻項目無法運作,再往回改又越來越多的問題.
2.無法檢視較早曆史版本.
3.多人協作,每個人的代碼不完全一緻,項目經理合并代碼時容易出現問題.
主流工具
SVN: (有點像自動同步功能的網盤),特點伺服器上維護共享檔案,用戶端下載下傳(checkout檢出); 用戶端可以修改代碼後在commit送出,也可以從伺服器上update更新最新代碼. SVN前些年,java項目,早期公司必用,但被GIT漸漸取代.
svn缺點:
1>有代碼版本控制功能但因為沒人使用,大家把它當做網盤使用.例如伺服器最開始共享一個代碼v1版本,分發給幾個程式員,然後程式員A開發了一個功能,并送出v2.後面送出功能的人由于代碼環境已變,自己開發的功能還需要費時調整.
2>伺服器一旦崩潰,依賴伺服器的用戶端如果沒有備份資料就丢失了.
(了解)git曆史
GIT:避免了以上缺點,現在公司的主流.相關的生态github也非常流行.每一個代碼送出的時間點都會打一個标簽,每一個程式員開發後送出時都會檢查與上一個最新版本的異同.每一個版本變更資訊都會下載下傳到每一個用戶端.點對點網狀形式拓撲.其中一個點出問題,可以從其他電腦恢複.
git
安裝
官網下載下傳,安裝.向導涉及的名詞在學習linux後會了解,無關緊要,全部保持預設點"next".
基本概念和指令
1.cd項目根目錄
2.[常用]git init : 初始化git倉庫,生成.git隐藏檔案夾,負責跟蹤項目檔案變更.
3.[常用]git add [檔案名] : 把一個檔案添加到"暫存區",未添加的檔案不會被跟蹤,git相比svn,網盤多的概念就是"暫存區".
不太适合跟蹤的檔案有:測試文法的小腳本;依賴包;資料庫
一個一個檔案add太麻煩,git add . (跟蹤所有檔案)。
排除跟蹤的檔案可以在.gitignore中設定.
4.[常用]git commit -m “送出時描述資訊” , 送出就好像是快照.
靠HEAD指針指向時間來管理不同時候送出的版本.每一次送出編一個唯一hash字元串辨別.送出資訊包含送出人和送出時間.
5.git log 檢視檔案變更狀态和送出曆史.
6.(第一次使用設定)git config --global user.email “你的郵箱”
git config --global user.name “你的名字”
7.git status 檢視是否跟蹤,是否變更.
8.git reset --head[送出id] , 版本回退
9.git diff HEAD --[file name] , 比較不同
分支
分支就好像影視作品裡的平行世界,分支代碼互不影響
作用: 1> 做分類 2> 開發新功能時建立分支dev,開發完成後再往master主分支上合并.
1.git branch [branch name] 建立分支
2.git branch 檢視所有分支,高亮的是目前所在分支
3.git checkout [branch name] 切換到分支
4.在master分支下執行 git merge [dev] 把開發的新功能合并到master分支
5.git branch -b [branch name] 第1,3條指令縮寫創分支并且檢出(百度)
遠端倉庫
之前我們做的都是儲存到本地,不夠安全,希望上傳到網絡,并且網絡可以多人協作和溝通.
知名的平台:
github(衆多的開源軟體) gitlab(體驗好界面好,要求電腦組態,公司局域内可以搭建), 國内gitee碼雲(國内速度快),阿裡code(跟阿裡項目管理工具結合緊密)
以github為示例:
大體功能:git自帶功能.watch項目有新内容時郵件提醒;star收藏;fork 克隆項目并上傳成為自己的項目.
準備工作:
在使用推送,下拉功能時,github平台可能報錯沒有權限.因為沒有配置指紋.htps和ssh,ssh協定更加安全.
ssh:secure Shell 直譯安全殼,連接配接遠端伺服器的協定,ssl加密.主要應用遠端登入雲服務.git伺服器.非對稱加密,需要生成秘鑰對,公鑰交給第三方平台.
0.安裝好git, 如果沒有設定git資訊設定一下
git config --global user.email “你的郵箱”
git config --global user.name “你的名字”
1.電腦本地生成秘鑰對.
終端運作 ssh-keygen 指令,ssh key generate
一路回保持預設
c:/user/xxx/.ssh/ id_rsa.pub 公鑰 id_rsa 私鑰
2.把公鑰檔案用文本編輯器打開,把内容複制到github-個人-settings-ssh keys
3.找一個倉庫 git clone [email protected]:canaan-yz/testgit3.git進行測試
1.克隆clone(下載下傳)
git clone [倉庫連結]
倉庫連結https ssh,ssh連結需要在網站添加指紋
2.下拉(更新)(已下載下傳前提下更新新内容)
git pull
3.參與到開源項目當中
自己開發,本地送出,平台上把自己送出作為pull requests(簡稱pr),項目管理者就會看到你的申請,覺得你代碼沒問題就會合并到主分支.
4.本地項目(上傳)推送到github
(第一次上傳)git push -u origin master
origin 約定俗稱代表遠端伺服器github.com
(僞代碼 git push -u local master origin master)
master遠端分支
-u 把本地目前分支關聯到遠端master分支.注意本地分支名一般與遠端分支名一緻.
(以後上傳)git push, 上傳已經commit過的代碼,沒有commit過的仍然在電腦本地 . 第一次使用此指令報分支未跟蹤錯誤.
情況一:github先建立空倉庫,然後clone到本地,之後commit ,(因為是clone是以分支已經對應好了)git push
情況二(大多數):本地開發好了想上傳,然後github建立空倉庫,需要把本地和遠端倉庫對應一下,設定origin遠端倉庫位址,git push -u.
建立空倉庫:起項目名一般與本地項目名一緻.readme.md .gitignore 如果本地已有的話不要遠端倉庫不要建立,否則送出時沖突.license隻是産權協定,不是特别正式的項目不需要.
5.解決沖突
兩個程式員clone了一份程式,程式員A添加了功能并送出,程式員B修改跟A同樣的一個檔案并送出,這時發生代碼沖突.B解決方案:放棄自己的修改,更新A的修改,在A的代碼基礎上在繼續自己的開發.或是強行送出,覆寫A的代碼.是以平時開發項目,最好先git pull 讓本地代碼最新,這樣沖突機率最小,在開發新功能,平時注意跟同僚事先溝通,開發完之後及時送出.
ide中以pycharm為例子中使用GUI
項目git init之後出現相關工具
紅色檔案表示未追蹤
add後變為藍色
commit後變為正常色
右上角
對号commit
向下箭頭pull 時鐘圖示可以看檔案曆史git log
回轉箭頭 傳回到最近一次送出
編輯區 右鍵 git-gitcompare可以檢視目前檔案跟某一版本的異同