GitHub工具多用在多人协作开发,多团队开发的开发模式中。入职前只是稍有涉略,基本命令尚不熟练,因为没在实际过程中遇到过。尤其是一些突发状况。这边使用GIT较多,操作也较多,中间确实遇到一些问题,才正经开始认识这些常用命令。
追加一些web helper.
0.
不必要的改动,比如编译生成的build目录,库文件,临时可执行文件等
git 根据提交历史里的字符串定位指定的commit
git log -S uplus_ble_role_type_t
查找本地对应的分支
git branch --contains $string
0.1 本地忽略,就是只针对你的git生效,同步开发的其他程序员不会看到用到这个设置。
vi .git/info/exclude ,
在最下面,以行为单位,添加你需要忽略的目录、文件即可。应该支持通配符。
1. 回滚
等同于ctrl+z,当你做了半天,发现不对,想反悔的时候,或者因为一些不当操作,就用到回滚这系列操作了。就是各种取消操作。
1.1 基本的 git reset --hard HEAD ,
1.2 基本的 git reset --hard HEAD^ 返回上一个版本
上面两个,在所谓 push之前,都可以用来取消当前的所有修改,HEAD的意思是最近的一次commit,是的你没看错,回到最近一次的commit,可以是你pull下来的,也可以是自己提交上去的。HEAD^是最近一次的上一次操作。就是这点区别。
但是当你push了,merge了之后,发现错了想反悔了,怎么办???
1.3 git reset --hard $(commit_id),退回到某一次更新ID
就是从 git log 中找到你想要返回的commit id。当你确定时,如果你想把刚刚做的,或者这个id之前的所有commit记录都取消,那么你可要慎重考虑下,因为这种操作是要强制修改服务器的,他会把这个commit之后的所有commit,都给清除掉。
1.4 git push origin (HEAD) --force, 强制回退,刷新服务器,或者是重置服务器。HEAD可选,HEAD一般代指当前commit的分支名。不加也没事,反正我还没碰到过。这个操作会把
好了,这就把你不想要的commit都给清掉了,或者说不想要的提交都清掉了,回到了那个指定为正确的版本。
但是,有时候可能commit已经找不到了,或者删了分支,或者清除了commit。这个时候怎么办?别急。除了git log,还有一个强有力的查找历史的命令
1.4 git reflog
怎么说呢,这个命令可以让你在一个操作记录版本库里,查找你要回退的操作。嗯,他跟commit不一样。它记载了你各种git操作,比如 checkout, revert ,push,merge,等等,实际就相当于操作日志,每个日志队对应一个编码值(HASH值,命令输出的第一列). 根据你自己的回忆,找到相应的hash值后,你就可以 --force了
回滚后依然记住要git push一下
撤销
1. 撤销 commit、并撤销 git add. 操作、不撤销修改代码
git reset --mixed HEAD^ 或 git reset HEAD^
// 效果和 git reset --mixed HEAD^ 一样,--mixed 是默认参数
2. 撤销 commit、不撤销git add .
git reset --soft HEAD^
3. 撤销 commit、撤销 git add . 操作、撤销修改代码
git reset --hard HEAD^
2.分支
查看分支
git brach -a 查看本地的分支
git brach -r 查看remote分支
git branch -v 查看当前所在的分支
2.1 切换分支 git checkout -t origin/xxx 直接切换到远程的分支,本地无副本
2.2 创建分支副本,前提是分支得在服务端存在
git checkout -b new_branch_local origin/branch_name(remote)
2.3 创建新分支,然后发布服务器。基于某个分支创建新分支,保留该分支的所有commit
1.切换到你想要复制的分支
2.git pull,拉过来最新代码
3.git checkout -b new_branch_local2.
4.git log 对照看下是否正确
5.git push origin new_branch_local2 推到远程
6. 重点: git branch --set-upstream-to=origin/new_branch_local2 据说是保持远程服务器自动同步的操作?
7.开始自己的改动操作。
2.3 合并指定目录的代码。不影响其他目录的改动。
有时候,一个功能模块可能存在于多个工程下,但是多个工程下除了相同模块,其他功能模块可能有很大区别。
某次,相同模块在别的地方被改了,需要更新进化。那么这时候,我们肯定不想用合并,因为可能在非相同目录上产生巨量的不必要的工作量。
git有这种便利操作吗。肯定有的,那就是 cherry-pick挑拣分支。
比如,另一个工程在另一个仓库里,前提是只涉及到相同模块的一次commit,那么我们就可以用命令把这次commit挑拣过来,作为一次补丁,放心的打在我们的相同模块上,当然,可能会导致一点点冲突,解决后在用命令提交即可。
2.3.1 git checkout res_tobe_fond
2.3.2 git log // find the corresponding commit included the modifation u want,make it sure .
2.3.3 git checkout res_tobe_update.
2.3.4 git cherry-up commit_specificed
2.3.5 这时候可能会有冲突,如果没有直接 git push,到这里就结束了。否则看下面
2.3.6 如果有,git status ; git diff 后会在代码里生成改动提示。VS里应该是个插件,改动的是两个版本的各自内容,你可以在最上面选择,那一行小字。
2.3.7 git add 改动后的修改
2.3.8 git cherry-pick --continue
2.3.9 git push...
2.4 if u just want pick some of the change from a commit , u can do...
git cherry-pick -n $commitID
如果commit里面有多个文件,执行此命令后需要先unstage 并恢复不想要改动的文件
git reset HEAD <file_name>
git checkout -- <file_name>
可能还能用到 git clean -f $filename
然后不同的是,git commit , git push
2.5 git从某一个commit新建分支进行开发
首先调用 git log 来查看历史commit信息
然后使用命令 git checkout [commitid] -b [new-branch-name] 来根据某个commit创建新分支
或者
# 查看所有提交记录
$ git log --oneline
# 复制想要创建分支的提交的SHA值
# 创建新分支
$ git checkout -b <new_branch_name> <commit_sha>
# 切换到新创建的分支
$ git checkout <new_branch_name>
最后推送到仓库中使用命令 git push origin [new-branch-name] 就会在仓库中生成一个新的 branch 用于接下来的开发
git branch --set-upstream-to=origin/new_branch_local2
3.多行提交
while u're going to make a new commit message , generally u would use "git commit -m "blablabla". You may find it not supportting multi-line input, then, how to input multi-line commit messeges , that's what we talk about on this tips.
多行提交有很多方式,
3.0 在你提交阶段 commi -m阶段,如果想实现分行多行
git co -m "commit title" -m "commit description"
或者 用这个shell本身支持的命令分行
git -m "commit title 回车
> 继续编辑 commit context
> commit end " 回车
3.1 在你刚刚add了一些文件后,发现少写了一些说明
git commit --amendgit
这回调出一个文本编辑界面,最上面是刚才编辑的提交说明,你可以接着写,然后提交
然后push
3.2 如果已经push了的话,也可以用3.1里的命令。如果已经涉及到了新的改动,想强制合并,
那么可以先add. 然后再调用上面的命令,在追加信息。
然后是强制上推的命令
git push origin (HEAD) --force (慎用吧,我是自己的临时分支,所以敢乱来)
4.git rebase -i 合并一些commit,然后成一个commit.有偷天换日之能.
5.删除(不用怕之前cherry-up过来的会被delete掉,那是新的commit了已经)
已有的本地分支要删除,搞起...
5.1切换到不被删除的分支
5.2 git branch -d [branch_name]. 先删除本地分支
5.3 git push origin --delete [branch_name].再删除远程分支
6.子模块
git submodule status 查看罗列子模块
git submodule update --init --recursive更新子模块
7. git stash
(1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list :查看stash了哪些存储
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :
删除所有缓存的stash
8. patch 补丁
7.1. diff 和 patch 的区别
Git 提供了两种补丁方案,一种是通过 git diff 生成的 .diff 文件,第二种是通过 git format-patch 生成的 .patch 文件。
通过 git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成 。通过 git format-patch 生成的 .patch 文件 含有 commmit 信息。一个 commit 对应一个 patch 文件。
在实际开发中,我们会经常用到补丁,不论是在代码迁移,还是bug修复中,都时常使用
7.2. 生成patch
git diff
指定文件生成 patch 文件
patch 补丁即为根据 git diff 生成的文本内容文件,最简单的生成方法为 git diff > test.patch。
举例子:比如我们修改了 A.java、B.java 文件,我们只想将 A.java 文件的修改打成 patch,那么我们可以使用以下的命令:
git diff A.java > test.patch
想把所有的修改文件打成 patch,即 A.java、B.java 文件,只需要使用下面的命令:
git diff > test.patch
指定 commit id 生成 patch
使用命令行
git diff 【commit sha1 id】 【commit sha1 id】 > 【diff文件名】
7.3 应用
先检查patch文件:
git apply --stat xxx.patch
检查能否应用成功
git apply --check xxx.patch
打补丁:
git apply xxx.patch
9. 当你想拉去所有分支
git fetch --all
git fetch --all && git pull --all
git fetch --tags
git fetch --tags && git tag -l | xargs -L1 git tag
a. 当你想比较两个分子的起点
git fetch origin
git merge-base <branch1> <branch2>
a. 当你想查看某个分支一段commit区间内的所有commit
git log 68aeeb5500521ff52c216862f9a653b64191f3ad..HEAD --oneline
其他技巧
1. 在Readme.md中加入图示.
将图片放在仓库里面,在文件里链接它,最后 push 到 github 上。
github 图片链接格式:

即 叹号! + 方括号[ ] + 括号( ) 其中叹号里是图片的URL。
(http://github.com/yourname/your-repository/raw/master/images-folder/xxx.png)
a. 当你想查看当前分支最初的提交
git rev-list --max-parents=0 HEAD
查看从第一个commit到最新提交的日志 git log --oneline --graph --all
查看特定作者或关键词的提交 : git log --oneline --graph --all --author="Author Name
查看特定范围的提交: git log --oneline --graph --all --since="YYYY-MM-DD" --until="YYYY-MM-DD"
git rev-list –max-parents=0 HEAD
然后在 README.md 里添加:
例如:我在我的 gitbug项目中有个图片

git ammend
对于已有一个提交记录push到远程, 但你本地目前有一点小的修改,想再推送到远程,但不想再生成一个提交记录,使得commit记录过多,且不想更改已有的commit message。
解决方案 :
1.git add . 将要更改的代码提交。
2. 这时候 可以使用 git amend进行合并代码
最后强推到远程
git push -f