Open jerryni opened 8 years ago
可以创建一个 还原了某次提交的 新的提交;
举例:
有3个提交记录:A-B-C
执行:git revert B
结果: A-B-C-D, D的提交记录就是将B的提交还原了,等同于A-C
这样的好处就是,不用再force update远程分支了,而是提交了一次新的更清晰的revert记录
基于同一个分支的两个分支改动了同一行代码,如果进行合并操作,就会有冲突。
比如A分支基于master,B分支也基于master,然后这2各分支都改了同一行代码。然后A merge B这样就会有冲突
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
git rebase --onto master server client
git rebase --onto topic~5 topic~3 topic
这个语句到底怎么理解比较合适??
git rebase --onto [1] [2] [3]
[1]是目标位置,将[2],[3]的diff内容合并到[1]这个提交上。
基础命令
初始化本地文件夹:
添加文件到暂存区, 并进行本地提交:
进行远程提交, 比如提交到Github(这步会有帐号验证), 建议用https协议:
本地从远程拉取更新内容:
查看文件修改状态:
添加所有修改文件到暂存区(不建议这么做, 每个git提交里,最好只是相关的文件,这样commit才更有意义):
修改最后一次的commit 信息内容:
[commit-hash]: 提交命令里的hash记录值, 从
git log
命令可以获取还原文件修改:
强制还原当前分支到指定分支(--soft会将不同文件存在暂存区):
还原远程库到指定版本(这是危险操作,一般是不建议用的):
git分支操作以及合并操作
分支操作
官方教程: https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
本地切到线上已经存在的分支(这个记得一定不要加-b, 很容易混淆):
基于提交历史新建分支, 如果没有[commit-hash]的话, 就是基于当前分支新建:
重命名分支:
合并以及冲突解决
基本合并命令,将其他分支合并到当前分支 :
merge命令后, 可以通过下面命令, 过滤出有冲突的文件列表:
如果有冲突, 冲突文件内容一般是这样的:
解决冲突就是把这内容修改一下, 包括去掉<<<< ==== >>>>这些东西, 然后修改成你需要的内容.
如果单纯的想用某个版本的文件, 使用当前分支文件(--ours), 或者用合并进来的分支文件(--theirs):
放弃合并:
我平时是git mergetool进行合并的, 效率会高些, 请参考这篇: git mergetool
其他常用命令
git config
主要用来配置git
显示配置:
设置用户名:
获取用户名:
设置全局, 加上
--global
即可:git tag
主要用来记录历史里重要的提交点, 比如上线.
打tag:
查看列表:
提交到远程:
删除:
git stash
在切换分支时,可以暂存当前分支修改的内容
存储当前修改:
查看stash列表:
将stash内容还原到当前分支:
清除stash:
显示git stash里的不同:
自定义stash内容
git rebase
参考地址: https://git-scm.com/docs/git-rebase
基本概念: 可以重建某个提交到另一个提交点上....
例子1: 将topic分支, 移动到master的头部, 在topic分支上运行:
例子2: 将next上的topic 移动到 master 上
例子3: 将顶部3个的提交,移动到,从顶部开始计数的倒数第5个提交上, 结果是FG节点被删除了
每次rebase都会产生一些冲突, 解决冲突方法同上, 修改完冲突后, 继续rebase:
放弃rebase:
git分支删除
参考: http://stackoverflow.com/questions/2447571/explain-command-for-git-delete-remote-branch
删除已合并分支:
删除未合并分支
删除远程分支(老版git):
删除远程分支(新版git):
远程分支删除后, 清除本地对远程的追踪分支:
作用同上, 但是是推荐的处理方法:
偶尔会用的命令
更新远程分支状态:
从暂存区撤回修改内容:
修改远程origin的地址
git status 自动编码设置: http://stackoverflow.com/questions/4144417/how-to-handle-asian-characters-in-file-names-in-git-on-os-x
删除远程库连接:
.gitignore
参考地址: http://git-scm.com/docs/gitignore
在项目根目录下, 创建.gitignore文件, 可以让git不追踪某些文件
只包含
foo/bar
文件夹的语法:如何忽略已经跟踪上的文件
参考: http://stackoverflow.com/questions/1139762/ignore-files-that-have-already-been-committed-to-a-git-repository
或者移除所有追踪文件:
之后再进行提交:
查看所有被忽略的文件:
git commit 备注规范
注释主要有一个思想就是: 很久以后,你需要再找一个功能或者,有必要看你的注释,你能分清,你这个提交到底做了什么?
add xx // 添加了文件 update xx //更新了功能 fix bug xx //修复了一个bug remove xx //移除了文件 foo xx //无关紧要的,比如去掉console什么的 todo 将要做什么,一般是下班后,未完成某个功能
Fix issue #8976 (xx不能登录) Add 打单模块css
Remove 哪个文件 (remove 的时候 要注意别人是否需要此文件 ) foo 删除console.log() //代码整理啊,什么的。。
Merge pull...(一般都是自动生成的)
Todo 要改什么什么 (一般就是下班了什么的,提交备份,本身代码并不完善,写todo,提醒自己明天做什么)
http://stackoverflow.com/questions/15324900/standard-to-follow-when-writing-git-commit-messages
查看提交记录
commit的前一提交 和commit相比
修改之前某个commit信息(不是最后一个)
git工作流思想的理解(待整理)
官方: https://www.atlassian.com/git/tutorials/comparing-workflows/ 中文版: https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md
其他细节
HEAD~ 和 HEAD^的区别 http://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git
http://schacon.github.io/git/git-rev-parse#_specifying_revisions
对比最后一个不提交的修改:
其他参考