git部署与基本命令汇总
GIT(分布式版本控制系統(tǒng))
集中化的版本控制系統(tǒng)
分布式版本控制系統(tǒng)
-
速度
-
簡單的設(shè)計(jì)
-
對非線性開發(fā)模式的強(qiáng)力支持(允許成千上萬個并行開發(fā)的分支)
-
完全分布式
-
有能力高效管理類似 Linux 內(nèi)核一樣的超大規(guī)模項(xiàng)目(速度和數(shù)據(jù)量)
起步 - Git 基礎(chǔ)
Git 基礎(chǔ)
直接記錄快照,而非差異比較
近乎所有操作都是本地執(zhí)行
Git 保證完整性
24b9da6552252987aa493b52f8696cd6d3b00373Git 一般只添加數(shù)據(jù)
三種狀態(tài)
| 中文 | 英文 | 含義 |
| 已提交 | committed | 已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫中了 |
| 已修改 | modified | 已修改表示修改了某個文件,但還沒有提交保存 |
| 已暫存 | staged | 已暫存表示把已修改的文件放在下次提交時要保存的清單中 |
-
blob,用于表示一個文件
-
tree,用于表示一個目錄,索引到若干文件或子目錄
-
commit,用于表示一次提交(commit)
| 1 2 3 | 1.在工作目錄中修改文件。 2.暫存文件,將文件的快照放入暫存區(qū)域。 3.提交更新,找到暫存區(qū)域的文件,將快照永久性存儲到?Git?倉庫目錄。 |
Git 使用規(guī)范
特別提醒:
-
使用Git過程中,必須通過創(chuàng)建分支進(jìn)行開發(fā),堅(jiān)決禁止在主干分支上直接開發(fā)。review的同事有責(zé)任檢查其他同事是否遵循分支規(guī)范。
-
在Git中,默認(rèn)是不會提交空目錄的,如果想提交某個空目錄到版本庫中,需要在該目錄下新建一個 .gitignore 的空白文件,就可以提交了
-
【代碼回溯注意】把外部文件納入到自己的 Git 分支來的時候一定要記得是先比對,確認(rèn)所有修改都是自己修改的,然后再納入。不然,容易出現(xiàn)代碼回溯
-
【代碼回溯注意】多人協(xié)作時,不要各自在自己的 Git 分支開發(fā),然后發(fā)文件合并。正確的方法應(yīng)該是開一個遠(yuǎn)程分支,然后一起在遠(yuǎn)程分支里協(xié)作。不然,容易出現(xiàn)代碼回溯(即別人的代碼被覆蓋的情況)
-
【代碼回溯注意】每個人提交代碼是一定要 git diff 看提交的東西是不是都是自己修改的。如果有不是自己修改的內(nèi)容,很可能就是代碼回溯
-
【代碼回溯注意】review 代碼的時候如果看到有被刪除掉的代碼,一定要確實(shí)是否是寫代碼的同事自己刪除的。如果不是,很可能就是代碼回溯
| 步驟 | Git 操作 |
| 克隆代碼 | git clone 遠(yuǎn)程代碼 |
| 創(chuàng)建分支 | git checkout -b branch_name |
| 在分支中開發(fā) | 無 |
| review代碼 | 無 |
| 第一輪測試 | 無 |
| 添加代碼到分支的暫存區(qū) | git add somefile |
| 提交代碼到分支 | git commit -m "本次提交的注釋" |
| 切換到主版本 | git checkout master |
| 獲取遠(yuǎn)程最新代碼 | git pull origin master |
| 合并某分支到master分支 | git merge branch_name |
| 解決合并時產(chǎn)生的沖突 請參考分支合并時沖突的解決 | 無 |
| 第二輪測試 | 無 |
| 準(zhǔn)備上線文檔 | 無 |
| 獲取遠(yuǎn)程最新代碼 | git pull origin master |
| 推送master分支 | git push origin master |
| 通知上線 | 無 |
| 沒有問題了刪除本地分支 | git branch -d branch_name |
配置 Git
git?config?--global?user.name??"caowlong"?#規(guī)定為姓名全拼 git?config?--global?user.email?"caowlong163@163.com"?#規(guī)定為公司郵箱 git?config?--global?merge.tool?"meld" git?config?--global?color.ui???true?#?使用git默認(rèn)的配色方案,推薦 git?config?--global?--list?#?查看配置信息 git?config?--global?user.name?#?查看?user.name?的配置信息| 1 2 3 4 5 6 7 8 | 1、從服務(wù)器上克隆完整的Git倉庫(包括代碼和版本信息)到單機(jī)上。 2、在自己的機(jī)器上根據(jù)不同的開發(fā)目的,創(chuàng)建分支,修改代碼。 3、在單機(jī)上自己創(chuàng)建的分支上提交代碼。 4、在單機(jī)上合并分支。 5、把服務(wù)器上最新版的代碼fetch下來,然后跟自己的主分支合并。 6、生成補(bǔ)丁(patch),把補(bǔ)丁發(fā)送給主開發(fā)者。 7、看主開發(fā)者的反饋,如果主開發(fā)者發(fā)現(xiàn)兩個一般開發(fā)者之間有沖突(他們之間可以合作解決的沖突),就會要求他們先解決沖突,然后再由其中一個人提交。如果主開發(fā)者可以自己解決,或者沒有沖突,就通過。 8、一般開發(fā)者之間解決沖突的方法,開發(fā)者之間可以使用pull?命令解決沖突,解決完沖突之后再向主開發(fā)者提交補(bǔ)丁。 |
| 1 2 3 | 1、查看郵件或者通過其它方式查看一般開發(fā)者的提交狀態(tài)。 2、打上補(bǔ)丁,解決沖突(可以自己解決,也可以要求開發(fā)者之間解決以后再重新提交,如果是開源項(xiàng)目,還要決定哪些補(bǔ)丁有用,哪些不用)。 3、向公共服務(wù)器提交結(jié)果,然后通知所有開發(fā)人員。 |
部署 Git
依賴庫:| 1 2 | yum?install?-y?curl-devel?expat-devel?gettext-devel?openssl-devel?zlib-devel?asciidoc?xmlto?docbook2x?perl-ExtUtils-Embed?texinfo yum?install?-y?tk?zlib-devel?openssl-devel?perl?cpio?expat-devel?gettext-devel?asciidoc?xmlto?openjade?perl-XML-SAX |
| 1 2 3 | wget?ftp://ftp.is.co.za/mirror/fedora.redhat.com/epel/6/x86_64/docbook2X-0.8.8-1.el6.x86_64.rpm rpm?-ivh?docbook2X-0.8.8-1.el6.x86_64.rpm ln?-s?/usr/bin/db2x_docbook2texi?/usr/bin/docbook2x-texi |
| 1 2 3 4 5 6 7 8 9 10 11 12 | wget?https://www.kernel.org/pub/software/scm/git/git-2.10.2.tar.gz?--no-check-certificate tar?-zxvf?git-2.10.2.tar.gz cd?git-2.10.2 make?clean?如果時間長,出現(xiàn)warning,可能是系統(tǒng)時間問題 [root@John?git-2.10.2]#?make?configure GIT_VERSION?=?2.10.2 ????GEN?configure ./configure?--prefix=/usr make?all?doc?info make?install?install-doc?install-html?install-info |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 創(chuàng)建新倉庫 獲取與創(chuàng)建項(xiàng)目 你得先有一個?Git?倉庫,才能用它進(jìn)行操作。倉庫是?Git?存放你要保存的快照的數(shù)據(jù)的地方。 擁有一個?Git?倉庫的途徑有兩種。在已有的目錄中,初始化一個新的, 其一。?比如一個新的項(xiàng)目,或者一個已存在的項(xiàng)目,但該項(xiàng)目尚未有版本控制。 如果你想要復(fù)制一份別人的項(xiàng)目,?或者與別人合作某個項(xiàng)目,也可以從一個公開的?Git?倉庫克隆, 其二。本章將對兩者都做介紹。 創(chuàng)建新文件夾,打開,然后執(zhí)行 git?init 以創(chuàng)建新的?git?倉庫。 |
| 1 2 3 4 5 6 | [root@John?/]#?ls?-a .???.autofsck?????bin???cgroup??etc???home??lib64???????media??mnt??opt???root??selinux??sys??usr??www ..??.autorelabel??boot??dev?????.git??lib???lost+found??misc???net??proc??sbin??srv??????tmp??var [root@John?/]#?cd?.git/ [root@John?.git]#?ls branches??config??description??HEAD??hooks??info??objects??refs |
| 1 2 | [root@John?git-2.10.2]#?git?config?--global?user.name?'John?Doe' [root@John?git-2.10.2]#?git?config?--global?user.email?XXOO@126.com |
| 1 2 3 | $?git?help?<verb> $?git?<verb>?--help $?man?git-<verb> |
| 1 | $?git?help?config |
基本用法
-
git add?files?把當(dāng)前文件放入暫存區(qū)域。
-
git commit?給暫存區(qū)域生成快照并提交。
-
git reset --?files?用來撤銷最后一次git add?files,你也可以用git reset?? ?撤銷所有暫存區(qū)域文件。
-
git checkout --?files?把文件從暫存區(qū)域復(fù)制到工作目錄,用來丟棄本地修改。
-
git commit -a?相當(dāng)于運(yùn)行?git add?? ?把所有當(dāng)前目錄下的文件加入暫存區(qū)域再運(yùn)行。git commit.
-
git commit?files?進(jìn)行一次包含最后一次提交加上工作目錄中文件快照的提交。并且文件被添加到暫存區(qū)域。
-
git checkout HEAD --?files?回滾到復(fù)制最后一次提交。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 設(shè)置用戶名:git?config?--global?user.name"your?name" 設(shè)置Email:git?config?--global?user.email"email?name" 創(chuàng)建目錄:mkdir?name 退回目錄:cd?name 顯示當(dāng)前目錄:pwd 把目錄變成git可管理的倉庫:git?init 添加文件到倉庫:git?add?文件名 提交文件到倉庫:git?commit 掌握倉庫當(dāng)前的狀態(tài):git?status 查看具體修改內(nèi)容:git?diff 查看歷史記錄:git?log 回退版本:git?reset?--hard?HEAD^ 恢復(fù)回退的版本:git?reset?--hard?版本號 記錄每一次記錄:git?reflog 把readme.txt文件在工作區(qū)的修改全部撤銷:git?checkout?--文件名 刪除一個文件:git?rm?文件名 版本庫里的版本替換工作區(qū)的版本:git?checkout?--?文件名 創(chuàng)建SSH?key:ssh-keygen?-t?rsa?-C?"郵箱名稱" 本地關(guān)聯(lián)遠(yuǎn)程數(shù)據(jù)庫:git?remote?add?origin?git@git.oschina.net:yanglijing2015.com/testGit.git git@git.oschina.net:yanglijing2013/newFile.git git@git.oschina.net:yanglijing2013/helloWord.git 將本地?cái)?shù)據(jù)推送到遠(yuǎn)程倉庫中:git?push?-u?origin?master(注意本地倉庫名稱一定跟遠(yuǎn)程倉庫名稱相同) 將遠(yuǎn)程倉庫中的數(shù)據(jù)下載到本地倉庫:git?clone??git@git.oschina.net:yanglijing2015.com/gitSkills.git 創(chuàng)建并切換分支:git?checkout?-b?分支名稱 查詢所有分支:git?branch 切換分支:git?checkout?分支名稱 合并指定分支到當(dāng)前分支:git?merge?dev 刪除分支:git?branch?-d?分支名稱 合并分支:git?merge?分支名稱 合并分支禁用Fast?forward:git?merger?--no-ff?-m?"注釋"?dev ?把當(dāng)前現(xiàn)場“儲存起來”:git?stash 查看工作現(xiàn)場列表:git?stash?list 恢復(fù)現(xiàn)場:1??git?stash?apply??stash內(nèi)容并不刪除,你需要用git?stash?drop來刪除; ??????????2??git?stash?pop??恢復(fù)的同時把stash內(nèi)容也刪了 強(qiáng)行刪除分支:git?branch?-D?分支名 將分支推送到遠(yuǎn)程倉庫的對應(yīng)分支上:git?push?origin?分支名稱 抓取最新的提交從遠(yuǎn)程倉庫中:git?pull 建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián):git?branch?--set-upstream?dev?origin/dev 在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支:git?checkout?-b?branch-名字?origin/branch-名字 創(chuàng)建標(biāo)簽:git?tag?標(biāo)簽名 查看標(biāo)簽:git?tag 對指定的commit打標(biāo)簽:git?tag?commitId? 創(chuàng)建帶說明的標(biāo)簽:git?tag?-a?標(biāo)簽名?-m?"說明"?commit的ID 刪除標(biāo)簽:git?tag?-d?標(biāo)簽名 推送標(biāo)簽名到遠(yuǎn)程:git?push?origin?標(biāo)簽名 一次性推送所有的標(biāo)簽名:git?push?origin?--tags 從遠(yuǎn)程倉庫刪除標(biāo)簽:gitpush?origin?:refs/tags/標(biāo)簽名 為命令配置別名:git?config?--global?alias.st?status |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 | 注意事項(xiàng): #1.?多提交(相當(dāng)于多保存,多^S): 在Git中任何已提交的東西幾乎總是可以恢復(fù)的。?甚至那些被刪除的分支中的提交或使用?--amend?選項(xiàng)覆蓋的提交也可以恢復(fù)。?然而,任何你未提交的東西丟失后很可能再也找不到了。 #2.?拉取別人數(shù)據(jù)之前要提交。減少工作區(qū),暫存區(qū)數(shù)據(jù)沖突的可能。 #3.?推送之前先拉取。即將自已的版本做為最新之前,要先合并別人的修改。 #4.?切換分支前要提交,否則有可能數(shù)據(jù)丟失。即保存在此分支的修改。 #5.?合并分支之前要提交。拉取視情況而定(建議拉取)。 #6.?慎用?git?checkout?--?<file> 撤消對文件的修改(拷貝了另一個文件來覆蓋它),?除非你確實(shí)清楚不想要那個文件了,否則不要使用這個命令。 #7.?嘗試讓每一個提交成為一個邏輯上的獨(dú)立變更集。一個問題一個提交,這個提交包含了這個問題的全部修改。 #8.?最后一件要牢記的事是提交信息。?有一個創(chuàng)建優(yōu)質(zhì)提交信息的習(xí)慣會使?Git?的使用與協(xié)作容易的多。 #9.?變基:只對尚未推送或分享給別人的本地修改執(zhí)行變基操作清理歷史,從不對已推送至別處的提交執(zhí)行變基操作。 #10.?SourceTree?GitFlow快捷鍵(mac):alt?+?花?+?F?異常驚艷 ?? 環(huán)境搭建 #1:安裝 Mac:?Mac蘋果系統(tǒng):?git2.10.1?+?sourceTree2.3.2 Win:?Windows?64?bit:?git2.5.1?+?TortoiseGit?+?zh #2:配置用戶信息 Win:?設(shè)置?--->?Git Mac:?sourcetree?--->?偏好設(shè)置?---->?通用 #3:?配置密鑰 Win:????? Mac:?$?ssh?-keygen?-t?rsa?-C?youremail@example.com?(一路yes或null就可以) 會存儲在:/Users/mac/.ssh/*.pub #4:?避免每次輸入密碼(未驗(yàn)證) git?config?--global?credential.helper?cache #5:倉庫劃分和SVN相同。 Art:加工?3dMax,?ps的資源成為unity使用的?*.ab Design:?提供服務(wù)器和客戶端用的表 Public.ResPackage:?存Art生成的資源 Public.PackedVersionConfig:?制做和存儲version.txt文件及熱更新文件 Public.TTDS_apk:存安裝包 Server:服務(wù)器 Client:客戶端 #6:?Clone工程 a.?創(chuàng)建目標(biāo)目錄 b.?Win:?---- Mac:?git?clone?client@10.1.10.100:tiantiandiansha.git c.?顯示隱藏文件?+?把(.git?+?其它調(diào)整到合適位置) d.?用工具打開:菜單--->?倉庫--->?git?flow?--->?初使化倉庫 確認(rèn)本工程在?Develop分支 分支 #1:?分支的劃分和目的(git?flow) a.?線上問題 master[主干]:?備份線上版本。 hotfix[臨時]:?修復(fù)線上bug。 b.?日常開發(fā) develop[主干]:?功能集成。 features[臨時]:?日常開發(fā)。 c.?發(fā)布 master[主干]:?根據(jù)Tag發(fā)布版本。 release[臨時]:?develop某些功能達(dá)到可發(fā)布程度,創(chuàng)建此分支,把功能集成到master,加Tag以備發(fā)版打包。 #2:在哪個分支上High a.?具體操做都在分支中完成,主干只負(fù)責(zé)數(shù)據(jù)集成。減少沖突方便并行。 把主干當(dāng)做單純的數(shù)據(jù)源,分支是一個獨(dú)立的空間。一個操做可以表述為,為達(dá)到一個目的從某個數(shù)據(jù)源取得數(shù)據(jù)、創(chuàng)建空間;然后在這個獨(dú)立的空間里對其進(jìn)行處理;處理完成之后再更新到某些數(shù)據(jù)源。一個操做結(jié)束。此分支也完成了他的使命。 b.?features:日常功能開發(fā)?+?develop上的bug修復(fù)。 c.?hotfix:?線上bug修復(fù)。 在master主干根據(jù)Tag創(chuàng)建,完成之后是否合并到develop或master需要根據(jù)develp或master的后續(xù)版本是否已修改來定。未修改的需要合并到develop+master。已修改的可以直接在hotfix分支打包發(fā)布。另外是否合并還要考慮是否是臨時性暴力修復(fù)。 注意:hotfix分支是從master舊的版本創(chuàng)建來的,合并時請注意莫回檔。 d.?release:目的是把develop成熟的功能合并到master并打Tag。供后面按需發(fā)布。不在release分支做bug修復(fù)。 e.?bug修復(fù): develop主干bug:由features分支修復(fù)。 master線上bug:由hotfix分支修復(fù)。 master未上線bug:由release?或?features?+?release修復(fù)(只果只用features需要手動將分支合并到master)。 #3:分支切換 a.?未跟蹤的文件:顯示在了工作區(qū)。因未納入任何分支,所以所有分支都可填加。 在目標(biāo)分區(qū)提交了原分區(qū)未暫存的文件,切換回原分支,原未暫存文件丟失。 b.?已暫存未提交(新增加的文件,開始跟蹤): 不放棄本地變更,到目標(biāo)分支時還在已暫存未提交狀態(tài)(sourceTree功能,將原分支的暫存狀態(tài)copy過來了)。 放棄本地變更,目標(biāo)分支不存在已暫存未提交文件。再切回原分支原已暫存未提交文件丟失。(放棄本地變更==放棄填加文件) 已暫存未提交(提交后再次修改): 不放棄本地變更,?sourTree不允許。提示,先提交或隱藏(stash),之后再切換。 放棄本地變更,目標(biāo)分支不存在已暫存未提交文件。再切回原分支,原已暫存的修改丟失。(放棄本地變更==放棄已暫存文件修改) 說明:切換分支時,將丟棄原分支已暫存的修改。 c.?已提交的文件:原分支已提交的文件不會帶入新的分支。 請牢記:當(dāng)你切換分支的時候,Git?會重置你的工作目錄,使其看起來像回到了你在那個分支上最后一次提交的樣子。?Git?會自動添加、刪除、修改文件以確保此時你的工作目錄和這個分支最后一次提交時的樣子一模一樣。 總結(jié):切換分支時,應(yīng)保存(提交或隱藏)本分支的操作。否則切換回來后,未保存的內(nèi)容將丟失。?因?yàn)楫?dāng)前工作區(qū)和暫存區(qū)只有一份,切換分支時要清除屬于原分支的內(nèi)容。未跟蹤或首次暫存內(nèi)容可進(jìn)入新分支是工具的優(yōu)化。 #4:?分支合并 何時會合并: a.?用git?pull從遠(yuǎn)端拉取時會合并(git?pull?=?git?fetch?+?git?merge)。 b.?主動合并分支時:如git?flow的?features?release?完成時。 合并方法: 在?Git?中整合來自不同分支的修改主要有兩種方法:merge?以及?rebase(變基) a.?未分叉情況:快進(jìn)方式(fast-forward) 由于當(dāng)前?master?分支所指向的提交是你當(dāng)前提交(有關(guān)?hotfix?的提交)的直接上游,所以?Git?只是簡單的將指針向前移動。?換句話說,當(dāng)你試圖合并兩個分支時,如果順著一個分支走下去能夠到達(dá)另一個分支,那么?Git?在合并兩者的時候,只會簡單的將指針向前推進(jìn)(指針右移),因?yàn)檫@種情況下的合并操作沒有需要解決的分歧——這就叫做?“快進(jìn)(fast-forward)” b.?分叉情況: 在這種情況下,你的開發(fā)歷史從一個更早的地方開始分叉開來(diverged)。?因?yàn)?#xff0c;master?分支所在提交并不是?iss53?分支所在提交的直接祖先,Git?不得不做一些額外的工作。?出現(xiàn)這種情況的時候,Git?會使用兩個分支的末端所指的快照(C4?和?C5)以及這兩個分支的工作祖先(C2),做一個簡單的三方合并。 和之間將分支指針向前推進(jìn)所不同的是,Git?將此次三方合并的結(jié)果做了一個新的快照并且自動創(chuàng)建一個新的提交指向它。?這個被稱作一次合并提交,它的特別之處在于他有不止一個父提交。 沖突: a.?只有合并時才會有沖突。 b.?文件沖突時,Git已經(jīng)完成了合并(有沖突標(biāo)記,此時沖突的文件應(yīng)是已修改未暫存狀態(tài)),但是沒有自動地創(chuàng)建一個新的合并提交。此時Git會暫停下來,等待你去解決合并產(chǎn)生的沖突。 在你解決了所有文件里的沖突之后,對每個文件使用?git?add?命令來將其標(biāo)記為沖突已解決。?一旦暫存這些原本有沖突的文件,Git?就會將它們標(biāo)記為沖突已解決。 變基: a.?原理: 它的原理是首先找到這兩個分支(即當(dāng)前分支?experiment、變基操作的目標(biāo)基底分支?master)的最近共同祖先?C2,然后對比當(dāng)前分支相對于該祖先的歷次提交,提取相應(yīng)的修改并存為臨時文件,然后將當(dāng)前分支指向目標(biāo)基底?C3,?最后以此將之前另存為臨時文件的修改依序應(yīng)用。 這兩種整合方法(merge和rebase)的最終結(jié)果沒有任何區(qū)別,但是變基使得提交歷史更加整潔。 b.?風(fēng)險(xiǎn): 變基也并非完美無缺,要用它得遵守一條準(zhǔn)則:不要對在你的倉庫外有副本的分支執(zhí)行變基。 總的原則是,只對尚未推送或分享給別人的本地修改執(zhí)行變基操作清理歷史,從不對已推送至別處的提交執(zhí)行變基操作,這樣,你才能享受到兩種方式帶來的便利。 發(fā)版相關(guān) a.?使用?master分支發(fā)版(舊版本?+?新版本),所以需將開發(fā)分支(develop)的修改合并到master。 b.?哪個倉庫需合并到master: Art:???(負(fù)責(zé)生成?AssesBundle的人?) Design:??? Server:?客戶端發(fā)版的人 Client:服務(wù)器發(fā)版的人 Public:?客戶端發(fā)版的人?或?制做熱更新包的人 c.?合并到master分支的時間: Art:?成功發(fā)版后和加Tag一起 Design:?成功發(fā)版后和加Tag一起 Public:?成功發(fā)版后和加Tag一起 Server:?發(fā)版結(jié)點(diǎn),開發(fā)分支測試通過后。 Client:發(fā)版結(jié)點(diǎn),開發(fā)分支測試通過后。 d.?加Tag: 成功發(fā)版后給master分支加Tag.?以備以后切換到此Tag當(dāng)時的版本改bug或發(fā)版本。 由合并到master的人加Tag. 注意:為保證根據(jù)Tag找到所有數(shù)據(jù),tag不能漏加,tag格式一致(至少含相同版本號,精確到資源版本號?1.0.38.0.0?)。 ?? 基礎(chǔ): 詳情請參考:https://git-scm.com/book/zh/v2 #1.?文件狀態(tài)及對應(yīng)的工作區(qū) Git狀態(tài):已修改(modified),已暫存(staged),已提交(committed)-----?只管理已跟蹤文件 工作區(qū):?工作目錄,?暫存區(qū),?Git倉庫 文件狀態(tài):未跟蹤?已跟蹤(未修改,已修改,已暫存) 未跟蹤:新加入當(dāng)前分支,從未暫存(git?add)過的文件。 已跟蹤:已提交到Git倉庫或暫存過的文件 已跟蹤已暫存:暫存區(qū)中的文件(git?add過)。 已跟蹤已修改:工作區(qū)中的文件。 已跟蹤未修改:已提交到Git倉庫的文件(git?commit過)。 #2.?暫存: 1.?暫存操作會為每一個文件計(jì)算校驗(yàn)和(使用SHA-1哈希算法) 2.?然后會把當(dāng)前版本的文件快照保存到Git倉庫中(Git使用blob對象來保存它們) 3.?最終將校驗(yàn)和加入到暫存區(qū)域等待提交。 #3.?提交: 1.?創(chuàng)建樹對象并保存到Git倉庫: Git會先計(jì)算當(dāng)前分支的每一個子目錄的校驗(yàn)和,然后在Git倉庫中將這些校驗(yàn)和保存為樹對象。 2.?創(chuàng)建提交對象并保存到Git倉庫: 隨后,Git便會創(chuàng)建一個提交對象(commit?object)。提交對象保存的內(nèi)容: a.?包含了作者的姓名和郵箱、提交時輸入的信息。 b.?指向它的父對象的指針。(首次提交產(chǎn)生的提交對象沒有父對象,普通提交有一個父對象,而由多個分支合并產(chǎn)生的提交對象有多個父對象) c.?還包含指向1創(chuàng)建的樹對象(項(xiàng)目根目錄)的指針。 3.?注意:提交只提交暫存區(qū)中的文件(修改過但未暫存的文件不會被提交)。 暫存提交之后:Git?倉庫中有五個對象: a.?三個?blob?對象(暫存時保存的文件快照) b.?一個樹對象(記錄著目錄結(jié)構(gòu)和?blob?對象索引) c.?以及一個提交對象(包含著指向前述樹對象的指針和所有提交信息)。 #4.?分支 a.?Git的分支,其實(shí)本質(zhì)上僅僅是指向提交對象的可變指針(Tag是不變的指針)。 b.?HEAD:?在?Git?中,它是一個指針,指向當(dāng)前所在的本地分支(譯注:將?HEAD?想象為當(dāng)前分支的別名)。 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B [個人理解]:?拉取,抓取,推送,都是對提交對象的下載上傳,分支進(jìn)度就是改變分支指針指向不同的對象。 #5.?抓取:git?fetch?[remote-name] git?fetch:?命令與一個遠(yuǎn)程的倉庫交互,并且將遠(yuǎn)程倉庫中有但是在當(dāng)前倉庫的沒有的所有信息拉取下來然后存儲在你本地?cái)?shù)據(jù)庫中。 https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8#_fetching_and_pulling #6.?拉取: a.?git?pull:?命令基本上就是?git?fetch?和?git?merge?命令的組合體。 b.?完整格式:git?pull?<遠(yuǎn)程主機(jī)名>?<遠(yuǎn)程分支名>:<本地分支名> b.?git?pull?:?Git從你指定的(當(dāng)前分支所跟蹤的)遠(yuǎn)程倉庫中抓取內(nèi)容,然后馬上嘗試將其合并進(jìn)你所在的分支中。 http://www.yiibai.com/git/git_pull.html #7.?推送:git?push?[remote-name]?[branch-name] a.?git?push:?計(jì)算你本地?cái)?shù)據(jù)庫與遠(yuǎn)程倉庫的差異,然后將差異推送到另一個倉庫中。?它需要有另一個倉庫的寫權(quán)限 #8.?.git?目錄 這些條目是?Git?的核心組成部分。 objects:?目錄存儲所有數(shù)據(jù)內(nèi)容; refs:?目錄存儲指向數(shù)據(jù)(分支)的提交對象的指針; HEAD:?文件指示目前被檢出的分支; index:?文件保存暫存區(qū)信息。 ?? 命令 詳情請參考:https://git-scm.com/book/zh/v2 http://www.yiibai.com/git/git_pull.html git?help git?init git?status a.?Untracked?files:?未跟蹤的文件 b.?Changes?to?be?committed:?(說明是已暫存狀態(tài)) (use?"git?reset?HEAD?<file>..."?to?unstage) c.?Changes?not?staged?for?commit:?(說明已跟蹤文件的內(nèi)容發(fā)生了變化,但還沒有放到暫存區(qū)) (use?"git?add?<file>..."?to?update?what?will?be?committed) (use?"git?checkout?--?<file>..."?to?discard?changes?in?working?directory) d.?You?have?unmerged?paths.(合并沖突) (fix?conflicts?and?run?"git?commit") e.?All?conflicts?fixed?but?you?are?still?merging. (use?"git?commit"?to?conclude?merge) git?status?-s ??:?新添加的未跟蹤文件前面有????標(biāo)記 A?:?新添加到暫存區(qū)中的文件前面有?A?標(biāo)記 MM:?修改過的文件前面有?M?標(biāo)記。?左M:?修改了并放入了暫存區(qū)?右M:?修改了還沒放入暫存區(qū). 兩位:左表暫存區(qū),右表工作區(qū) 說明:-s?不顯示需推送的內(nèi)容,只涉及到工作區(qū)和暫存區(qū),Git倉庫的狀態(tài)不顯示。 git?add?<文件|目錄>?:?(添加內(nèi)容到下一次提交中) a.?開始跟蹤新文件 b.?把已跟蹤(已修改)的文件放到暫存區(qū) c.?合并時把有沖突的文件標(biāo)記為已解決狀態(tài)等 運(yùn)行了?git?add?之后又作了修訂的文件,需要重新運(yùn)行?git?add?把最新版本重新暫存起來: git?reset?HEAD?<file> 說明:取消暫存的文件 NOTE:?雖然在調(diào)用時加上?--hard?選項(xiàng)可以令?git?reset?成為一個危險(xiǎn)的命令(譯注:可能導(dǎo)致工作目錄中所有當(dāng)前進(jìn)度丟失!),但本例中工作目錄內(nèi)的文件并不會被修改。?不加選項(xiàng)地調(diào)用?git?reset?并不危險(xiǎn)?—?它只會修改暫存區(qū)域。 git?checkout?--?<file> 說明:撤消對文件的修改(拷貝了另一個文件來覆蓋它) IMPORTANT:這是一個危險(xiǎn)的命令。?你對那個文件做的任何修改都會消失。除非你確實(shí)清楚不想要那個文件了,否則不要使用這個命令。 git?diff 此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,?也就是修改之后還沒有暫存起來的變化內(nèi)容。 請注意,git?diff?本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動。?所以有時候你一下子暫存了所有更新過的文件后,運(yùn)行?git?diff?后卻什么也沒有,就是這個原因。 git?diff?--staged(等同于?git?diff?--cached) 查看已暫存的將要添加到下次提交里的內(nèi)容。是暫存文件和已提交文件的比較。 git?commit?(這種方式會啟動文本編輯器以便輸入本次提交的說明) git?commit?-m?"Story?182:?Fix?benchmarks?for?speed" 請記住,提交時記錄的是放在暫存區(qū)域的快照。?任何還未暫存的仍然保持已修改狀態(tài),可以在下次提交時納入版本管理。?每一次運(yùn)行提交操作,都是對你項(xiàng)目作一次快照,以后可以回到這個狀態(tài),或者進(jìn)行比較。 git?commit?-a?-m?'added?new?benchmarks'?(git?acm:?git?add?+?git?commit?-m) git?commit?--amend commit之后:版本修改將添加到歷史記錄 git?rm?PROJECTS.md(等于?git?rm?-f?PROJECTS.md) git?rm?--cached?PROJECTS.md git?rm?-f?PROJECTS.md 目標(biāo)文件未被跟蹤:操做無效 目標(biāo)文件在暫存區(qū): a.?無參:提示加參數(shù)?--cached?或?-f b.?-f:?從暫存區(qū)中刪除,也從本地文件系統(tǒng)中刪除。 c.?--cached:?從暫存區(qū)中刪除,但不從本地文件系統(tǒng)刪除。 目標(biāo)文件已提交在Git倉庫中: a.?無參或加-f參數(shù):即從倉庫中刪除,也從本地文件系統(tǒng)中刪除。 b.?--cached:?從倉庫中刪除,但不從本地文件系統(tǒng)刪除。 git?mv?file_from?file_to 運(yùn)行?git?mv?就相當(dāng)于運(yùn)行了下面三條命令: $?mv?README.md?README $?git?rm?README.md $?git?add?README git?log?-p?-2 git?log?--pretty=oneline git?log?--pretty=format:"%h?-?%an,?%ar?:?%s" git?log?--pretty=format:"%h?%s"?--graph git?log?--since=2.weeks git?log?-Sfunction_name git?log?--pretty="%h?-?%s"?--graph?--?1.txt git?log?--oneline?--decorate?查看各個分支當(dāng)前所指的對象 git?clone?https://github.com/schacon/ticgit git?clone?git@github.com:mojombo/grit.git?NewName git?remote git?remote?-v git?remote?show?[remote-name]?查看遠(yuǎn)程倉庫 git?remote?add?<shortname>?<url>?添加遠(yuǎn)程倉庫 git?remote?rm?paul?遠(yuǎn)程倉庫的移除 git?remote?rename?pb?paul?遠(yuǎn)程倉庫的重命名 git?fetch?[remote-name]?從遠(yuǎn)程倉庫中抓取與拉取 a.?這個命令查找?“origin”?是哪一個服務(wù)器(在本例中,它是?git.ourcompany.com),?從中抓取本地沒有的數(shù)據(jù), b.?并且更新本地?cái)?shù)據(jù)庫. c.?移動?origin/master?指針指向新的、更新后的位置。 當(dāng)?git?fetch?命令從服務(wù)器上抓取本地沒有的數(shù)據(jù)時,它并不會修改工作目錄中的內(nèi)容。?它只會獲取數(shù)據(jù)然后讓你自己合并。 要特別注意的一點(diǎn)是當(dāng)抓取到新的遠(yuǎn)程跟蹤分支時,本地不會自動生成一份可編輯的副本(拷貝)。?換一句話說,這種情況下,不會有一個新的?serverfix?分支?-?只有一個不可以修改的?origin/serverfix?指針。 可以運(yùn)行?git?merge?origin/serverfix?將這些工作合并到當(dāng)前所在的分支。?如果想要在自己的?serverfix?分支上工作,可以將其建立在遠(yuǎn)程跟蹤分支之上 ?? git?push?[remote-name]?[branch-name] 當(dāng)你和其他人在同一時間克隆,他們先推送到上游然后你再推送到上游,你的推送就會毫無疑問地被拒絕。?你必須先將他們的工作拉取下來并將其合并進(jìn)你的工作后才能推送。?閱讀?Git?分支?了解如何推送到遠(yuǎn)程倉庫服務(wù)器的詳細(xì)信息。 git?tag git?tag?-l?'v1.8.5*' git?tag?-a?v1.4?-m?'my?version?1.4'?附注標(biāo)簽 git?tag?-a?v1.2?9fceb02?后期打標(biāo)簽 git?tag?v1.4?輕量標(biāo)簽 git?show?v1.4 git?push?origin?v1.5?共享標(biāo)簽 git?push?origin?--tags git?push?origin?--delete?serverfix?刪除一個遠(yuǎn)程分支 基本上這個命令做的只是從服務(wù)器上移除這個指針。?Git?服務(wù)器通常會保留數(shù)據(jù)一段時間直到垃圾回收運(yùn)行,所以如果不小心刪除掉了,通常是很容易恢復(fù)的。 git?checkout?-b?version2?v2.0.0 在?Git?中你并不能真的檢出一個標(biāo)簽,因?yàn)樗鼈儾⒉荒芟穹种б粯觼砘匾苿印?如果你想要工作目錄與倉庫中特定的標(biāo)簽版本完全一樣,可以使用?git?checkout?-b?[branchname]?[tagname]?在特定的標(biāo)簽上創(chuàng)建一個新分支: git?checkout?-b?[branch]?[remotename]/[branch] git?checkout?--track?origin/serverfix git?checkout?-b?sf?origin/serverfix git?branch?-u?origin/serverfix 設(shè)置已有的本地分支跟蹤一個剛剛拉取下來的遠(yuǎn)程分支,或者想要修改正在跟蹤的上游分支,你可以在任意時間使用?-u?或?--set-upstream-to?選項(xiàng)運(yùn)行?git?branch?來顯式地設(shè)置。 git?branch git?branch?-v?查看每一個分支的最后一次提交 git?branch?-vv?查看設(shè)置的所有跟蹤分支,可以使用?git?branch?的?-vv?選項(xiàng) 需要重點(diǎn)注意的一點(diǎn)是這些數(shù)字的值來自于你從每個服務(wù)器上最后一次抓取的數(shù)據(jù)。?這個命令并沒有連接服務(wù)器,它只會告訴你關(guān)于本地緩存的服務(wù)器數(shù)據(jù)。?如果想要統(tǒng)計(jì)最新的領(lǐng)先與落后數(shù)字,需要在運(yùn)行此命令前抓取所有的遠(yuǎn)程倉庫。?可以像這樣做:$?git?fetch?--all;?git?branch?-vv git?branch?--merged git?branch?--no-merged git?branch?testing git?branch?-d?iss53 git?checkout?testing git?checkout?-b?iss53 git?pull a.?在大多數(shù)情況下它的含義是一個?git?fetch?緊接著一個?git?merge?命令。 b.?不管它是顯式地設(shè)置還是通過?clone?或?checkout?命令為你創(chuàng)建的,git?pull?都會查找當(dāng)前分支所跟蹤的服務(wù)器與分支,從服務(wù)器上抓取數(shù)據(jù)然后嘗試合并入那個遠(yuǎn)程分支。 git?pull?<遠(yuǎn)程主機(jī)名>?<遠(yuǎn)程分支名>:<本地分支名> git?merge?iss53 git?rebase?master git?gc 最妙之處是你可以隨時重新打包。?Git?時常會自動對倉庫進(jìn)行重新打包以節(jié)省空間。當(dāng)然你也可以隨時手動執(zhí)行?git?gc?命令來這么做。 當(dāng)版本庫中有太多的松散對象,或者你手動執(zhí)行?git?gc?命令,或者你向遠(yuǎn)程服務(wù)器執(zhí)行推送時,Git?都會這樣做。 |
Git 常見變量
| 1 2 3 4 5 6 7 8 9 | HEAD:?表示最近一次的?commit。 MERGE_HEAD:?如果是?merge?產(chǎn)生的?commit,那么它表示除?HEAD?之外的另一個父母分支。 FETCH_HEAD:?使用?git-fetch?獲得的?object?和?ref?的信息都存儲在這里,這些信息是為日后?git-merge?準(zhǔn)備的。 HEAD^:?表示?HEAD?父母的信息 HEAD^^:?表示?HEAD?父母的父母的信息 HEAD~4:?表示?HEAD?上溯四代的信息 HEAD^1:?表示?HEAD?的第一個父母的信息 HEAD^2:?表示?HEAD?的第二個父母的信息 COMMIT_EDITMSG:?最后一次?commit?時的提交信息。 |
總結(jié)
以上是生活随笔為你收集整理的git部署与基本命令汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker 入门教程指南
- 下一篇: mysql dba系统学习(2)了解my