版本控制工具Git,其他的工具還有SVN
共享代碼,追溯記錄,存儲.c文件
Git實現的功能:回溯(以前某個時間節點的數據情況)共享(大家共享修改)
Git:80%? ? ? ?SVN(離線不可用安全): 10%? 使用率
Git:地址公司發
?如果是使用hhs的方式的話 clone方式和賬號密碼輸入驗證機制改變
在公司中如果是自己搞的服務器拿到的公鑰要給給服務器管理者設置一下就可以了。
git的使用主要問題在于入職的第一天,最難的是查看分支。
以后主要就是這兩個指令
git push
git put
【注意】git是一個工具,在linux系統和windows系統輸入命令都是一樣的。
git和gitee,github的關系
git是一個工具是一個軟件
gitcode,gitee,github是一個遠程的倉庫,也可以自己建立一個服務器,通過git進行訪問
去公司需要清楚公司的遠程倉庫是存在什么位置,有可能是在公司自己的服務器上,有可能也是在gitee上如果是在gitee上的話連手機熱點的話就可以獲得。如果是在局域網中的一個服務器的話,就不能下載,需要連接局域網。
對于遠程倉庫的上傳和下載需要驗證賬號密碼
本地的郵箱和用戶名(只是用來作為一個標識)和遠程倉庫的賬號和密碼沒有關系。
記得需要注意在這里設置
git config --global user.email 222@qq.com
git config --global user.name youname
git config --global core.editor vim
可以在.git中的.gitcong中查看
?在如果遠程是一個開源庫,這樣的話需要在git push和 git pull的時候需要輸入密碼
如果遠程是一個私有庫,這樣的話是在clone的時候需要輸入密碼。
如果只是想要輸入一次密碼而不是多次輸入密碼的話使用這個命令:
注意: (如果老是每次都和中央倉庫交互都需要輸入賬號密碼: ?windows: ?<strong>git config --global credential.helper manager</strong> ) (Linux: ? ? <strong>git config --global credential.helper store</strong>)?
本地的郵箱和用戶名只是用來標識誰在什么時候上傳了什么代碼
readme是對于當前程序的說明文檔,會進行自動更新。
兩種下載方式:下載zip就是下載一份代碼不會進行后續的互動,需要有后續的互動修改的話,就采用https的方式或者是ssh方式進行下載
通過git alone進行下載以后在本地會有一個與之同名的文件夾,其中會有一個文件夾.git由系統生成
.git記錄文件變化,本地倉庫和緩沖區一般可以認為對應.git。
可以認為工作空間是對應剩下的文件
一般在說的時候都是會說本地倉庫緩沖區和工作空間
如果是開源的話,是可以搜到也可以上傳。但是也還是不能上傳,需要將一些成員添加為開發者和管理者。可以加一個開發者或者管理者(他可以邀請別人),可以進行訪問和上傳。
在哪個位置git clone的話,文件的數據就是會下載到哪一個地方
在執行git命令的時候需要注意是在工作空間中進行執行,其中會有兩種情況可以實現就是可以在含.git的文件夾中(在這個文件夾中創建文件),也可以在這個位置創建一個文件夾在這個文件夾也可以。
剛剛創建的文件一開始是放在工作空間中如果想要上傳到遠程倉庫中需要一層層上傳。
git add filename就是將工作空間指定文件的變化放到緩沖區中
git add . 所有文件變化放在緩沖區中? ? ? git add *.c將所有的.c文件放到緩沖區中
【注意】注意記錄到緩沖區的都是變化,并不是文件本身。
【注意】將工作空間的變化放到緩沖區中還是可以一個文件一個文件的放,在其他的時候傳遞的話都是只能整體進行傳輸
【注意】當修改文件以后,還需要再次提交修改記錄。
當從工作空間刪除文件以后,再次git add以后緩沖區的記錄就會消失,只有在下面這兩層才能抵消
緩沖區的變化必須要一次交給本地倉庫
git commit -m '備注' 將緩沖區的變化放到本地倉庫中去會一次上傳全部,如果沒有在一開始就設置用戶或者是郵箱的話,這個將git commit -m ‘備注’ 會失敗因為找不到
【注意】備注必須要加要明確說明自己做了什么用中文就好,對于工作而言
通過看同事的備注來寫自己的備注。
git是以版本來記錄變化
commit后跟的是版本號,后面就是我們自己提交的信息,版本是基于上一個版本的更新。
?initial commit是一開始創建的時候勾選的初始化
【注意】以上的變化都是在本地的,并沒有影響遠程倉庫。
將本地倉庫的變化上傳到遠程倉庫中去
每天寫完以后都add,commit,進行版本的迭代,如果說新的版本不夠好,還能找回來舊的版本
分支問題(很重要)
可能會出現這個項目寫了一半可能需要寫另外一個項目的情況,這個時候如果直接寫新的代碼將log交織在一起,就亂了。
只要不將分支進行合并的話,主邏輯是不會變化的。(在每次變化以后都add和commit)
當然可以分支再分支不用易錯
上面是本地倉庫的分支,下面的是遠程倉庫的分支。
【實際工作】要不都是在遠程創建分支,要不就是在本地創建分支,不要再遠程和本地都弄就混亂
git branch haha 創建一個新的分支
git checkout haha 切換到分支haha
可以將兩個任務合在一起git checkout -b haha
【注意】在一個分支中不add不commit的話沒有跟蹤的話就沒有保存在這個分支中會出錯
將log記錄用一行顯示,顯示所有的分支,以圖標的形式顯示
?這種情況是主分支產生了y型分支
?
如果是進行y型分支還是一樣的指令,會彈出來一個vim編輯器里面就是可以添加的注釋
在看這個的時候就需要注意就是在看每一個分支的時候就是看哪個分支是有*號的,就是哪個分支有哪個文件。
當然在這種情況下在dev1分支中沒有master.c文件的這個時候如果想讓dev1分支有這個文件的話,就將這個分支再合并回來。
當這種y型分支結構進行合并的時候如果是在master分支進行合并的時候(git merge dev1)這樣的話主邏輯標記向前移動一個版本,dev1也想像向前移動一個版本的話直接merge就向前移動一下
條件1當沒有y型分支結構的時候,書面寫法是 dev1分支領先master分支(一個版本????)
條件2需要先切換回主分支
git?merge dev1就可以進行合并,在底層的實現就是將主分支的標記向前移動一位。
沖突情況的處理
第一種情況:版本沖突:兩個分支都都是修改的同一個文件,修改的內容無沖突(絕大多數情況)
一樣可以進行merge,git工具會自動合并出一個合并版本,文件中的內容這兩處修改都會被包含
第二種情況:兩個分支都都是修改的同一個文件,修改的內容有沖突,即修改的內容內存空間是連續的。(工作中誰遇到沖突誰解決,一般遇不到)
怎么判斷是不是相鄰的內存,是由git進行判斷,不是說隔一個字就不是相鄰的了
這種情況如果還是用第一種的方式的話(在使用merge命令的時候),就會出現合并沖突問題。
這個時候在去訪問這個文件的時候,會發現里面發生了變化,第一步是手動改成自己想要的內容(記得刪除==《《等)第二步是再add和commit
【注意】當在dev1分支在繼續向后進行處理的時候需要在dev1進行merge進行合并,再寫dev1的時候再從主邏輯繼續創建分支,避免沖突混亂。
本地與遠程
注意本地和遠程也可能出現像是本地的主要的分支和次要的分支,注意需要本地上傳的時候是基于本地的主分支進行上傳。
當基于上一個版本,遠程和本地的倉庫都有不同的版本的時候,也就是y型結構。這個時候本地是不能上傳的,需要先進行pull拉下來
【注意】本地和遠程是保證是一個名字,同時本地和遠程也是都可以創建分支但是只在一端操作
git push? ? ? ? ? ? ? ? ? ? ? ? ? ?簡寫指令
git push origin master? ? 將master分支主分支推到遠程上面去
git push --set-upstream origin 分支名 將非主分支推到遠程
git push origin --delete 分支名 刪除遠程分支
git push就是相當于將本地的版本推到遠程服務器上去,當本地的服務器版本比較落后的時候再使用git pull把數據拉下來
當然可以在本地linux進行分支的建立,也可以在遠程進行分支的建立
git fetch origin 分支名? 更新獲取遠程倉庫的狀態,將這個狀態拉下來到本地
git merge origin 分支名 ?
這個時候就可以理解為本地的兩個分支,合并之后可以得到一個合并版本,這個時候本地就是上傳數據了。
// 把遠端的關聯的分支fetch下來,并且merge到當前所在分支上?
git pull origin 分支名 相當是上兩個命令合并
【注意】建議使用git pull origin 分支名
// 如果之前已經建立關聯分支, 等價于(git pull origin 分支名)
git pull 上一個命令的簡化版本
在b處出現了y型分支結構,通過fetch查看和merge合并到本地,pull將兩個合在在一起
然后上傳到遠程。
當產生y型分支的時候需要在進行pull然后在進行push上傳。
在協同工作的時候記得落后的時候記得pull?
【注意】沒事要記得經常pull,大家早上pull,有可能同事先修改中午push上去,自己下午修改以后
【注意】一定一定記得git add和git commit將自己寫的內容放到本地倉庫以后,干凈的狀態以后再進行pull,也就是工作空間是干凈的。可以通過git status進行查看。
【注意】不要經常push,這樣的話同事會認為你更新了很多的內容。自己寫了很多的內容,并且已經寫的很完善了。在下午或者是晚上下班的時候再push。
最常見的分支模型
【注意】在使用的時候很少使用只有一個master的模型,一般都是用一個master和一個dev開發分支,在master中只是放最正確的版本,在dev分支中存放修改版本。
當對于dev分支修改的內容比較小的時候直接就在dev分支上面修改就可以,如果說修改的內容比較大的時候就可以在dev上面再重新開一個分支對于代碼的內容進行修改,之后再將分支合并到dev修改分支上面去。
當發現master出現錯誤的時候也會需要對于版本進行修改,這個時候就是在master主線上開一個分支對于代碼進行修改。這就是說當dev已經完善以后需要git push
刪除分支
// 安全的刪除: (確保這個分支的內容分支已經被合并到上游)
git branch -d 分支名
// 強制刪除分支:?
git branch -D 分支名
就是說在一個分支上存在的數據在別的分支上沒有
遠程創建分支,將分支拉到本地
可以通過git pull知道遠程的分支
git push origin dev2將數據上傳到dev2分支上去
這兩個dev2需要版本具有一致性,也就說遠程和本地創建分支以前是一樣的,
【重要】如何可以更加安全就是先git pull 然后再創建分支
如果說本地和遠程上,遠程是比本地要領先一個版本的,在本地dev上進行pull和merge,然后在進行后續的工作。
【重要】看公司的分支結構,不要在master上書寫代碼。
回退問題?(慎重因為回退是找不回來的)(在遠程是不會進行回退的)
在工作空間的回退:這個地方在不同版本的ubanto系統中可能需要不同的代碼進行回退
【了解】因為會有在輸入git status的時候會有提醒。有的地方是使用git checkout 文件名,git restore 文件名
在緩沖區的回退:在回退一次以后就回到了工作空間,還要繼續回退才可以
在本地倉庫的回退:
git reset --hard 版本號(就是前面那個數據)
注意這個版本號不用一定要寫全,在--oneline的時候版本號本身就是不全的。
【注意】遠程倉庫是不能回退的!!!!!已覆蓋的方式修改
如果說是上傳的時候,可以修改完程序的時候,自己修改完事以后再上傳將文件數據覆蓋掉。
緊急回退,如果說是版本錯的比較多的時候,將遠程的代碼pull下來,在本地回退以后再上傳上去。
可以使用可視化的工具,可以追溯歷史,并且可以add和commit等pull和push
也可以在gitee中查看歷史記錄
忽略文件:
文件太大,文件太多,文件沒用(.o)沒有必要上傳遠程倉庫
git文件的大小是有限制的,一般是1024M,這個也是和git的應用場景是有關的,如果文件特別大的時候不如說是可以用優盤直接傳。
有時候不會上傳一個動態庫,也可能是因為文件的個數非常多,太過于碎片化
vim .gitignore名字是固定的。
例如在其中可以設置為*.o表示忽略所有的o文件
【注意】被追蹤的文件是不可以被忽略的(加ignore文件的時間太晚了)。所以盡可能早的創建ignore文件。(在創建倉庫的的時候有選項?)
這個.ignore文件就是記得在創建倉庫的時候就創建。
【問題】如果是在ignore文件創建以前有想被忽略的文件,需要刪掉重搞這個文件。
如果是本地已經寫好了很多的代碼數據,忘記交給git進行管理。這種情況可以在遠程創建一個已經inittal庫,然后將本地的文件復制過去。注意可能忽略的文件,不要忘記在.ignore文件中進行忽略。
遠程創建一個空倉庫,不想移動代碼,就這樣。在本地打開gitshll命令輸入行,在本地進行
本地進行git init,然后再去關聯遠程倉庫
// 方法一
1, 手動創建遠程倉庫
2, 創建本地倉庫(git clone): 產生本地倉庫, 工作空間, 緩沖區
3, 把文件移到 工作空間 目錄
4, 管理文件(git add .)
5, 產生版本(git commit -m '注釋')到本地倉庫
6, 提交到遠程倉庫git push
7, 正常使用
需要關聯一個遠程倉庫
方法二
1, 在代碼文件所屬目錄, 創建本地倉庫(git init)(還創建了緩沖區 和 工作空間)
2, 管理文件(git add .)
3, 產生版本(git commit -m '注釋')到本地倉庫
4, 創建遠程倉庫: 不要選擇任何模板和初始化 (創建了一個全空的遠程倉庫)
5, 關聯遠程倉庫: git remote add origin https://gitee.com/snow-lee/lalala.git
6, 提交到遠程倉庫: git push -u origin "master"
7, 正常使用