Git 原理探秘
版本控制系统与 Git
Git 内部原理基础
Git 基本操作
Git 团队协同开发指令
还没push 前可以做的事
Git概念及工作原理总结
Git 内部原理详解
本文档使用 MrDoc 发布
-
+
首页
Git 基本操作
Git 是分散式的,表示你不需要伺服器,在本地端就有完整的 *Repository* 。 ## 建立、新增、修改、递交 从头建立 Repository: ``` mkdir sandbox cd sandbox git init ``` 第一次 commit 递交: ``` touch README git add README git status git commit -m “First Commit” ``` 修改看看: ``` 編輯 README 做些變更 git status git diff git add . (一次加入所有變更跟新增檔案,但不包括刪除的檔案!) git status git diff --cached git commit -m “Update README” ``` ## 暂存区 一个 Git 目录里,可以分成三种区域: * 目前工作目录 Working tree * 暂存准备递交区 Staging Area * 储存库 Repository ![暂存区](/media/202203/2022-03-03_0034230.5983542316865377.png) 而 Working tree 里的档案有四种状态: ![暂存区](/media/202203/2022-03-03_0034230.7195451673655034.png) * 没有被追踪的档案 Untracked files * 有修改、还没准备要被递交 Changes not staged for commit * 有修改、准备要被递交的档案(在 Staging Area) Changes to be committed * 已经被递交的档案 Committed Staging Area 算是 Git 独有的功能,有什么好处呢? * Working tree 可能很乱,包含了想要 commit 的内容和不相关的实验修改等 * Staging area 的设计可以让你只 commit 想要的档案,甚至是想要的部份修改而已 * Staging Area 又叫作 Index 只 commit 部分档案: ``` touch a.rb touch b.rb git add a.rb git commit “Update a” git add b.rb git commit “Update b” ``` staging 之后又再修改内容: ``` 修改 a.rb git add a.rb 再次修改 a.rb git commit -m “commit a” 這時 commit 的內容是第一次修改當時的內容而已 ``` 只 commit 同一档案部分内容: ``` git add --patch y 加到 staging n 不要加到 staging s 可以拆小一點 hunk ``` 或者用 GUI 例如 gitx 来选取 在 commit 之前如何复原修改? 使用 git reset 和 git checkout 指令,你打 git status 就有提示了,不需要记起来。 ## 删除和搬移档案 ``` git rm a.rb git mv b.rb c.rb git add . git commit “Remove a, Rename b to c” ``` 没有 copy ? 因为 Git 是追踪内容(相同内容 SHA1 相同),你只要 cp 即可,不用担心浪费空间。 ## revert (还原 commit 记录) ``` 新增一筆 commit 來做還原 例如本來的 commit 是新增一行,那麼 revert commit 就會移除那一行 git revert e37c75787 git revert HEAD^ ``` ## Tag 下标签 ``` git tag foo git tag foo <SHA1> git tag bar -m “some message” git tag git tag -d foo ``` ## 历史纪录 ``` git log git log --oneline git log --oneline --decorate --graph git log 很多參數可以用,但是建議還是用 GUI 吧... ``` ## 查看程式码逐行的历史纪录 ``` git blame <filename> git blame -L 100,10 <filename> ``` `-L` 参数可以从第一百行开始显示 10 行 ## 比较差异 Diff ``` git diff <SHA1> 拿 Working Tree 比較 git diff <SHA1> <SHA1> git diff --stat <SHA1> git diff --cached 或 git diff --staged 拿 Staging Area 來比較 ``` ## 砍掉 untracked 档案 ``` git clean -n 列出打算要清除的檔案 git clean -f 真的清除 git clean -x 連 gitignore 裡列的檔案也清掉 ``` ## 忽略不需要追踪的档案 ``` 編輯 .gitignore (屬於專案的設定,會 commit 出去) 編輯 ~/.gitignore (你個人的 Global 設定) 空目錄不會 commit 出去,必要時需要放 .gitkeep 檔案 ``` [.gitignore 大集合](https://github.com/github/gitignore) 通常什么档案不需要 commit 出去? * 时间/* * 日志/* * 你个人环境的设定档(例如你偏爱的编辑器设定档) * 可以自动产生的档案 * build/* 等 compile 之后的档案 * .DS_Store * 大拇指.rb ## Commit 基本原则 * 适当的粒度/相关性/独立性 * 以一个小功能、小改进或一个 bug fixed 为单位。 * 对应的 unit test 程式在同一个 commit * 无相关的修改不在同一个 commit * 语法错误的半成品程式不能 commit * git diff –check 可以检查多余的空白 * commit 讯息很重要 * 第一行写摘要 * 有需要写实作细节的话,放第二行之后 ## 开分支 何时开 Branch ? * Topic feature 开发新功能 * Bug 修复 * 重构(refactor) * 任何实验 开分支: ``` git branch new_feature git branch 或 git branch <SHA1> git checkout new_feature (以上兩步可以合一 git checkout -b new_feature) touch new_feature.rb git add new_feature.rb git commit -m “New feature” ``` 合并 branch 回来 ``` git checkout master git merge new_feature ``` > Git 预设的 branch 叫做 *master* Branch 更名和删除 ``` git branch -m old_name new_name git branch -M old_name new_name (強制覆蓋) git branch new_feature -d git branch new_feature -D (強制刪除) ``` ## 四种合并方式 ### 1. Straight merge 预设的合并模式 保留被合并的 branch commits 记录,并加上一个 merge commit,看线图会有两条 Parents 线。如果是 fast-forward,就不会有 merge commit。除非加上–no-ff 参数。 ### 2. 压缩提交 ``` git merge new_feature --squash ``` 压缩成只有一个 merge-commit,不会有被合并的 log。SVN 的 merge 即是如此。 ### 3. 樱桃采摘 ``` git cherry-pick 714cba ``` 只合并指定的 commit -x 参数会在 log 里加注本来是哪个 SHA1 (适合用在 backpointing 情境) ## 使用 branch 注意事项 切换 working tree 的 branch 时,如果有档案在 staging area 或是 modified,会无法切换。可以先 commit,反正只要不 push 出去,再 reset 回来即可 或是用 stash 指令暂存起来 ``` git stash git stash apply git stash clear ``` ## 什么是 Three-way merge * two-way merge 只用两个档案进行合并(svn 预设即 two-way merge) * three-way merge 除了要合并的两个档案,还加上两个档案的共同祖先。如此可以大大减少人为处理 conflict 的情况。 ## Git 合并策略 1. recursive,当共同的祖先不只一个 commits 时,递回式的进行 three-way merge (此为预设) ``` git merge foobar -s recursive -X ours git merge foobar -s recursive -X theirs ``` 2. resolve,直接挑一个共同的祖先进行 three-way merge 3. octopus,当合并超过两个以上的 branchs 时 4. ours,只用自己的 branch 的 commits 5. subtree 合并成一个子目录 ## Git 可以一次合并多个 Branchs ``` git merge A B C ```
追风者
2022年3月3日 00:35
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码