jerryni / blog

:dog: :dog: :dog:
https://github.com/jerryni/blog/issues
11 stars 4 forks source link

git 实战记录 #13

Open jerryni opened 8 years ago

jerryni commented 8 years ago

主要记录平时工作过程中git的使用和实战经验

基础命令

初始化本地文件夹:

git init

添加文件到暂存区, 并进行本地提交:

git add README.md git commit -m "first commit"

进行远程提交, 比如提交到Github(这步会有帐号验证), 建议用https协议:

git remote add origin https://github.com/[username]/project.git git push -u origin master

本地从远程拉取更新内容:

git pull

查看文件修改状态:

git status

添加所有修改文件到暂存区(不建议这么做, 每个git提交里,最好只是相关的文件,这样commit才更有意义):

git add .

修改最后一次的commit 信息内容:

git commit --amend -m "New commit message"

[commit-hash]: 提交命令里的hash记录值, 从git log命令可以获取

还原文件修改:

git checkout [path] git checkout [commit-hash] [path]

强制还原当前分支到指定分支(--soft会将不同文件存在暂存区):

git reset --hard [commit-hash]

还原远程库到指定版本(这是危险操作,一般是不建议用的):

git reset --hard [commit-hash] git push -f origin branch_one

git分支操作以及合并操作

分支操作

官方教程: https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

本地切到线上已经存在的分支(这个记得一定不要加-b, 很容易混淆):

git checkout [branch-name]

基于提交历史新建分支, 如果没有[commit-hash]的话, 就是基于当前分支新建:

git checkout -b new_branch_name [commit-hash]

重命名分支:

git branch -m [newname] git branch -m [oldname] [newname]

合并以及冲突解决

基本合并命令,将其他分支合并到当前分支 :

git merge [other_branch_name]

merge命令后, 可以通过下面命令, 过滤出有冲突的文件列表:

git ls-files -u | cut -f 2 | sort -u

如果有冲突, 冲突文件内容一般是这样的:

.myicon {
<<<<<<< HEAD
  background-image: url(../images/sprite_160329.png);
=======
  background-image: url(../images/sprite_0330.png);
>>>>>>> dev-wd
}

解决冲突就是把这内容修改一下, 包括去掉<<<< ==== >>>>这些东西, 然后修改成你需要的内容.

如果单纯的想用某个版本的文件, 使用当前分支文件(--ours), 或者用合并进来的分支文件(--theirs):

git checkout --theirs path/file git checkout --ours path/file

放弃合并:

git merge --abort

我平时是git mergetool进行合并的, 效率会高些, 请参考这篇: git mergetool

其他常用命令

git config

主要用来配置git

显示配置:

git config --list

设置用户名:

git config user.name 'xx'

获取用户名:

git config user.name 获取

设置全局, 加上--global即可:

git config --list --global

git tag

主要用来记录历史里重要的提交点, 比如上线.

打tag:

git tag -a v1.2 -m 'my msg'

查看列表:

git tag

提交到远程:

git push --tags git push origin [tag-name]

删除:

git tag -d [tag-name]

git stash

在切换分支时,可以暂存当前分支修改的内容

存储当前修改:

git stash

查看stash列表:

git stash list

将stash内容还原到当前分支:

git stash apply stash@{0}

清除stash:

git stash clear

显示git stash里的不同:

git stash show -p stash@{4}

自定义stash内容

git stash save xxxx

git rebase

参考地址: https://git-scm.com/docs/git-rebase

基本概念: 可以重建某个提交到另一个提交点上....

例子1: img1 将topic分支, 移动到master的头部, 在topic分支上运行:

git rebase master topic

例子2: img2 将next上的topic 移动到 master 上

git rebase --onto master next topic

例子3: img3 将顶部3个的提交,移动到,从顶部开始计数的倒数第5个提交上, 结果是FG节点被删除了 image

每次rebase都会产生一些冲突, 解决冲突方法同上, 修改完冲突后, 继续rebase:

git rebase --continue

放弃rebase:

git rebase --abort

git分支删除

参考: http://stackoverflow.com/questions/2447571/explain-command-for-git-delete-remote-branch

删除已合并分支:

git branch -d branchname

删除未合并分支

git branch -D branchname

删除远程分支(老版git):

git push origin :branchname

删除远程分支(新版git):

git push --delete origin branchname

远程分支删除后, 清除本地对远程的追踪分支:

git remote prune origin

作用同上, 但是是推荐的处理方法:

git branch -dr branchname

偶尔会用的命令

更新远程分支状态:

git remote update

从暂存区撤回修改内容:

git reset -q [path]

修改远程origin的地址

git remote set-url origin [url]

git status 自动编码设置: http://stackoverflow.com/questions/4144417/how-to-handle-asian-characters-in-file-names-in-git-on-os-x

git config --global core.quotepath false

删除远程库连接:

git remote rm origin

.gitignore

参考地址: http://git-scm.com/docs/gitignore

在项目根目录下, 创建.gitignore文件, 可以让git不追踪某些文件

只包含foo/bar文件夹的语法:

/ !/foo /foo/ !/foo/bar

如何忽略已经跟踪上的文件

参考: http://stackoverflow.com/questions/1139762/ignore-files-that-have-already-been-committed-to-a-git-repository

git rm --cached [filepath]

或者移除所有追踪文件:

git rm -r --cached .

之后再进行提交:

git add .; git commit -m 'xx';

查看所有被忽略的文件:

git status --ignored

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相比

git diff [commit]^ [commit]

修改之前某个commit信息(不是最后一个)

  1. hash1是你想修改的commit
  2. git rebase -i ‘hash1^'
  3. 弹出commit信息,修改里面的pick => edit,保存
  4. 执行普通的amend命令
  5. git rebase —continue完成

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

xxx

http://schacon.github.io/git/git-rev-parse#_specifying_revisions

对比最后一个不提交的修改:

git diff HEAD~1 HEAD

其他参考

jerryni commented 7 years ago

git revert

可以创建一个 还原了某次提交的 新的提交;

举例: 有3个提交记录:A-B-C 执行:git revert B 结果: A-B-C-D, D的提交记录就是将B的提交还原了,等同于A-C

这样的好处就是,不用再force update远程分支了,而是提交了一次新的更清晰的revert记录

jerryni commented 3 years ago

如何创造一个merge conflict?

基于同一个分支的两个分支改动了同一行代码,如果进行合并操作,就会有冲突。

比如A分支基于master,B分支也基于master,然后这2各分支都改了同一行代码。然后A merge B这样就会有冲突

jerryni commented 3 years ago

git rebase 再次记录

https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA img

img2

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]这个提交上。