Git 还没push 前可以做的事(转)
Git 版本控制系統(3) 還沒 push 前可以做的事
转载:http://ihower.tw/blog/archives/2622
這一集要講的是:還沒 push 前可以做的壞事,也就是 reset 跟 rebase。
相較於 SVN 這種 commit 就是送到遠端伺服器,Git 的 commit 其實東西都還是在本地端,所以只要你還沒 push 出去分享給別人,你的 commit logs 是可以修改的!! 這種功能非常的 powerful,可以讓你 undo 和 rewrite commit history。如果你用 Git 只會 git commit 然後接著馬上 git push,那你就沒有學到精隨啊!~
使用告誡:如果你已經 push 出去了,請千萬不要做 rewrite history 的動作,會天下大亂啊。正確善用 undo changes/rewrite history 的功能,我們可以讓東西準備好弄的整整齊齊才 push 出去給別人 pull。
讓我們來學幾招吧:
amend
git commit -C HEAD -a –amend 快速修正前一次 commit 的錯誤,只要修 typo 之後打這行,就會替換掉前一次的 commit
reset
git reset 砍掉 commit 重來,但是修改的程式還是留在 working tree。例如:
git reset HEAD^ 就會回到前一版本(一個^表示是前一版),並把其中的 changes 繼續留在 working tree 中。適合發現前一次 commit 有問題或是想要修改 commit log,可以修改後再重新 commit。
git reset 如果加上 –soft 參數則會把 changes 直接加到 staging area。
加上 –hard 參數表示不留 staging area 也不留 working tree(完全刪除任何修改記錄),例如:
git reset –hard HEAD^ 則會完全抹掉前一次的 commit。
另個常用的情境是要把修改的檔案從 staging area 移走,指令就是 git reset HEAD filename (但還是留在working tree)。BTW,要回復 working tree 中修改的檔案成本來的樣子,指令是 git checkout filename (重新拿出本來的檔案)
順道一提,如果東西已經 push 出來了,要怎麼回復? 這時候就得用 revert 了。
git revert 會用一個新的 commit 來回復所有的變更(適合已經push出去給別人的情境)。加上 -n 可以不先 commit,這樣可以多 revert 幾次後再一次 commit。
指令會有差別都是因為 remote repo.<-> local repo.<->staging area<->working tree 分了四層移來移去的關係,你只要想清楚這幾層就融會貫通了 (請參考第一集有解釋 staging area 和 working tree)。
rebase
我在 使用 rebase 避免無謂的 merge 一文中有解釋過 rebase 的其中一個用途。而 rebase 的真正潛力是,我們可以從指定的版號之後,重新隨你意 commit 一次來重建 history,超威的。首先輸入 git rebase -i 版號 就會可以跳出 editor 可以編輯,我們可以
a. 變更 commit 順序
b. 將多個 commit 合併 squash
c. 將一個 commit 打散 (edit 會停著讓你可以 git reset HEAD^ 打散重新 commit,完成後 git rebase –continue )
另一種 rebase 用法是不需要打 -i ,直接指定另一個 branch 或 tag,這樣就會重新 commit 另一個 branch 的東西,然後才 commit 自己的 (也就是 使用 rebase 避免無謂的 merge 的用法)。
git rebase 若有 conflict 就會停下來, 跟 merge 一樣處理完 add,然後 git rebase –continue 就會繼續 commit (也可以 –skip 或 –abort 放棄啦)
rebase 有個 onto 參數用法,使用的情境是:假設你有三個有 dependency 的 branch 分別叫做 master/contact/search,後來發現 search branch 只有 depend on matser,於是你可以輸入 git rebase –onto master contact search 這樣就會讓 search branch 從 master 的地方開始重新 commit。
再次提醒,rebase 千萬只能適合東西還沒 push 的情境,或是你自己的 local 專用私人 branch。rebase 一個已經 push 出去的 repository,然後你又把修改的 history push 出去,是會造成超級大災難的。
在學習 rebase 的過程中,很容易拿來跟 merge 比較一下。我發現一個有趣的不同點:如果有檔案在要被 merged 的 branch 中被刪除,如果用 rebase 檔案最後會不存在,但是用 merge 的話檔案最後還在 XDXD
另外,在 rebase branch 之後,如果再做 merge,就會發現因為 master 直接就是被 merge 的祖先,所以線圖直接變成一條線,而有這種 parent 關係的 merge 就叫做 fast-forward。換句話說,因為沒有發生任何 merge commit,也不會發生 conflict,Git 內部單純只是變更 reference 參照,所以謂之 fast-forward。
好心提醒,因為開 local branch 是如此便宜無害,所以要做 rebase 時建議您可以先開一個 local branch 來實驗 rebase。老實說,rebase 還挺危險的 XDXD
最後,rebase 我認為算是 Git 初學者最難理解的功能吧,但是如果不知道什麼是 rebase,就不能說是懂 Git 啊。
Git 还没push 前可以做的事(转)的更多相关文章
- git 检查是否有commit到本地但还没push的代码
使用 git status 命令可以得到以下结果 $ git status On branch dev_getTicketCnt Your branch is ahead of 'origin/mas ...
- git回到没push的commit
创建: 2017/10/28 merge master以后数据库出了问题,改好以后发现view有点问题,commit以后没提交就reset了.过后才想起来怎么回去???吓成狗,索性找到了下面这个. ...
- githug rename_commit 修改已经commit但还没push的一条message
githug 第 45 关, 一开始对 git rebase -i 这个东西有误解, 记录一下正确的用法 ddmobadeMac-mini:git_hug ddmoba$ githug reset 4 ...
- git删除已经提交的包含敏感信息的文件(还没提交到远程仓库)
写好的代码已经提交了(但还没push到github),发现某个文件里包含密码.如果push的话,密码可就被公开了.如果在代码里改掉密码,再commit一次,也不行,历史提交记录还是会上传到github ...
- 趁webpack5还没出,先升级成webpack4吧
上一次将webpack1升级到3,也仅是 半年前,前端工具发展变化太快了,如今webpack4已经灰常稳定,传说性能提升非常高,值得升级. 一直用着的webpack3越来越慢,一分多钟的编译时间简直不 ...
- git快速入门 push/clone/reset/merge/切换分支全都有
本文介绍git快速入门,从安装/创建init / 发布push/版本回退reset / branch分支切换/合并分支merge 这些基本的操作都有涉及,方便新人快速入手,有需要的朋友mark一下.首 ...
- 成功熬了四年还没死?一个IT屌丝创业者的深刻反思
三个IT屌丝创业的故事 从前有三个屌丝,聚在一起做网络.提供免费的网络服务,砸锅卖铁,通宵达旦,除了卖肾,啥都做了.3年后终于做到了五百万用户.对于年轻人来说,能把五百万人玩弄于鼓掌之间,已经是很牛逼 ...
- .Net Actor 服务端开发框架,Newbe.Claptrap 项目周报 1 - 还没轮影,先用轮跑
Newbe.Claptrap 项目周报 1,第一周代码写了一点.但主要还是考虑理论可行性. 第一次接触本框架的读者,可以先点击此处阅读本框架相关的基础理论和工作原理. 周报是啥? 成功的开源作品,离不 ...
- git clone,push,pull,fetch命令详解
源自 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌 ...
随机推荐
- mysql数据库知识
学而时习之,不亦说乎! --<论语> 数据库所有操作的总结. 1.mysql的数据库服务为mysqld.exe windo ...
- PIE SDK元素的删除
1功能简介 元素删除是将根据需求将不符合的元素进行删除,PIE SDK支持元素的删除操作,下面对元素的删除功能进行介绍. 2功能实现说明 2.1.1 实现思路及原理说明 第一步 获取已经选择的元素 第 ...
- PIE SDK分类统计
1. 算法功能简介 分类统计功能是将分类后的结果统计输出. PIE SDK支持算法功能的执行,下面对分类统计算法功能进行介绍. 2. 算法功能实现说明 2.1. 实现步骤 第一步 算法参数设置 第二步 ...
- 【STM32学习笔记】STM32f407 使用4*4矩阵键盘
作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明.谢谢! 写在前面: 这是本人第一次开始写博客,可能写的不是很好,也请大家谅 ...
- C#异步执行带有返回值和参数的方法,且获取返回值
很多时候需要用到这些小知识点,做做笔记一起成长 下面是需要异步执行的方法 //获取所有的邮件 private List<EmailModel> GetEmailOnlyCount(POP3 ...
- elasticSearch请求流程图
- CssClass初步语法了解
首先 创建Css有三种方法 这里面就不一一介绍了,主要说第二种 创建第二种Css样式表 要在标签<title><title>标签下面写 如: <style type= ...
- 在 Linux 上创建第一个 Service Fabric Java 应用程序
先决条件 开始之前,请安装 Service Fabric SDK.Azure CLI,并在 Linux 开发环境中设置开发群集. 如果使用 Mac OS X,则可使用 Vagrant 在虚拟机中设置 ...
- 世界、国家、省、城市SQL
共享一份 世界.国家.省.城市最全的SQL(mysql可直接使用),笔者是花了下载币下载的 下载SQL # pid=0 获取所有国家 # pid=99999999 获取中国的省.自治区.直辖 ...
- python占位符%s,%d,%r,%f
input接收的所有输入默认都是字符串格式 1.%s代表字符串占位符 conn, client_addr = phone.accept() print(conn) print(client_addr) ...