Git十全大补
- 一定要弄gitignore, 而且是配全局的, 否则你会被ds_store搞死.
- 为啥要配全局.
-
允许git pull的情况下, 我们应该咋办? 用图示解释.
1. gl 2. gaa 3. gcam '' 4. gp
-
如果一不小心, 先做了gaa 和gcam 咋办?
1. gaa 2. gcam '某个注释' 3. gf 4. grb 5. gp
-
改变pull的行为->rebase
本地分支和远程分支的绑定(tracking),加上 rebase 策略: [branch "master"] remote = origin merge = refs/heads/master rebase = true 这样一来,更新代码(pull)的时候就会自动应用 rebase 而不是产生 merge commit,除非有其他情况产生,比如三方合并造成了冲突需要人共去干预。大部分时候还是很聪明的,只要团队里的习惯都良好,那么可以保持一个非常干净漂亮的树形。 配置了这个项目之后, 可能会报错: fatal: The current branch master has multiple upstream branches, refusing to push. 通过修改gitconfig文件可以解决: [remote "origin"] push = HEAD 原因是, 如果不指定分支, 则分支要对应去推. 之前没有指定branch, 那么默认的模式是完美的, 但是咱们指定了branch, 那么就出问题了, 就要指定remote 原因确定了, 是因为在.gitconfig和.git/config都定义了[branch 'master']虽然定义一模一样, 但是, git还是晕了.
-
git快捷键:
### 实用快捷键 ### add之前 - gapa #用这个添加, 会能够看到修改的内容. - gd #git diff - gdw #git diff —word-diff - gsps是否可以?????? ### add之后 - gdca #git diff -cached ### commit 之后 - gsps #git show --pretty = short --show-signature - gwch #git whatchanged -p --abbrev-commit --pretty = medium ### 看修改记录 - glgp filename #git log --stat --color -p - git log -c -S '你要搜索的字符串比如删除的那一串' 你要搜索的文件路径/你要搜索的文件名.java #此处的-c和-S都是diff命令 - gbl #git blame -b -w filename #查看每一行是谁写的 ### 已经记住的, 经常用的 - gst - gl - gp - gaa - gcam - gf - grb
快捷键我们也可以自由定义
#看一下zsh的设置 cat ~/.zshrc #从上面能看到是引入了下面这个 cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh #从这个文件就能看到一堆alias, 就是之前列出来的那些了.
-
git比较差异
- add之前 git show就可以 - add之后 git diff - commit之后 git show head diff xxx ooo#这个其实最爽了, 如果有文件的话. beyond compare #只有文本也可以, 这个是我最喜欢的地方. 1. 目前暂存中的修改:git diff --staged 2. 尚未缓存的改动:git diff 缩写: gd 3. 查看已缓存的改动: git diff —cached 缩写: gdca 4. 查看已缓存的与未缓存的所有改动:git diff HEAD 5. 显示摘要而非整个 diff:git diff --stat 6. gdt git diff-tree --no-commit-id --name-only -r 7. gdw git diff --word-diff
参考: [http://m.runoob.com/git/git-basic-operations.html]
-
git拿到某个版本
git checkout -b store # 在目前分支的基础上生成新的分支store git checkout 某个file # 不仅仅是拿分支, 也可以拿到最新版本, 也就是说放弃本地修改
-
git查询
git log -p filename #这个命令真的看到了代码变化. git diff --word-diff #详细展示一行中的修改 git log -c -S '你要搜索的字符串比如删除的那一串' 你要搜索的文件路径/你要搜索的文件名.java #找到删除的内容 git ls-files --others -i --exclude-standard #查看所有被忽略的文件
-
git各种状态查看
gst #查看状态 git remote git branch git tag git show git log git config git config --list #很神奇的是, 直接git config 呼出的帮助里面没有list这个项目. open ~/.gitconfig # 可以直接查看这个文件. git config -l #缩写方法. git config -e #git config --edit的缩写, 用文本编辑器编辑.
-
git设置
git config --global credential.helper osxkeychain #记住https的密码, 不过随着mac的升级, 这个貌似不好使了 git branch --set-upstream-to=origin/master master #指定默认的pull和push的branch gp -u <remote_name> <local_branch_name>#改变git的default remote. ssh-keygen -t rsa -C "你的邮箱@qq.com" #生成秘钥. pbcopy <~/.ssh/id_rsa.pub #copy秘钥. #然后在github或者gitlab贴入秘钥就好了, 如果服务器没有装gitlab, 没关系, 命令行可以搞定, 把秘钥存入相应目录就好了.
- 原子解释
pull = fetch + merge
git fetch origin # 抓取源origin的master分支, 在本地成为origin/master分支, 注意这个分支不是本地的master分支, 我们可以手动合并到master分支. fetch只是把远程origin抓到本地origin/master.
git merge master # 生成了一个新的版本, 合并了master到当前分支, 但是, master和store依旧是分叉的, 有分叉的过去和分叉的未来.
git rebase master # 把master当做当前分支的基础, 这样master和store就没有分叉的历史了, 看上去也比较清爽, 而且也比较符合实际的业务逻辑. 这样当你推向主线的时候, 主线的管理者不需要merge了.
-
git 暂存操作
git reset —hard #抛弃未commit修改, 这个是必须的 git clean -dfx #清除那些没有被版本控制的文件. 这个是配套的, 如果git status没有显示未控制文件, 那么可以不弄这句. git stash #把本地未提交的东西保存一下. 免得checkout不同分支时会被混掉, 我就发生了这事. 血的教训啊. #stash 是一个栈, 可以pop出来, 也可以直接抛弃掉. # 类似下面的三句话, 可以简化 git stash git checkout some_branch git stash pop git checkout --merge some_branch #这是简化版.
-
git每日工作流程
- http://gwiki.cn/2016/12/git每日工作流程
- http://gwiki.cn/2016/12/git每日工作流程之回退
- http://gwiki.cn/2016/12/git每日工作流程之从基础来理解他
-
git提交进一步
gst #可以看到修改了哪些文件, 然后就可以进行下面的操作了 git add --patch gapa # 用这个添加, 会能够看到修改的内容. - add之前 show就可以 git show git diff file gd #直接调用不带参数的git diff,将显示工作目录树中未被暂存(当然还没有提交)的改动。(比较的是工作目录树与暂存区)。 - add之后 git diff git diff –cached<file> gdca # 添加参数--cached,是比较暂存区和版本库之间的区别。 - commit之后 git diff HEAD #添加参数HEAD,可以比较工作目录树(包括暂存的和未暂存的修改)与版本库之间的差别。HEAD关键字指的是当前所在分支末梢的最新提交(也就是版本库中该分支上的最新版本)。 git show head gsps #git show --pretty = short --show-signature gwch #git whatchanged -p --abbrev-commit --pretty = medium - 更多内容 #详细展示一行中的修改 git diff --word-diff gdw #和git log配合 git diff <hashcode> <hashcode> <file> ### 如果确切知道文件名 glgp # git log --stat --color -p glgp filename #这个命令真的看到了代码变化.
-
git跟踪
```sh如果确切知道文件名
glgp # git log –stat –color -p
glgp filename #这个命令真的看到了代码变化.
如果记得文件内容, 可以定位到删除的内容
git log -c -S ‘你要搜索的字符串比如删除的那一串’ 你要搜索的文件路径/你要搜索的文件名.java
glg
glgg
查看每一行是谁写的
gbl #git blame filename
查看历史修改记录
glol -p filename #好的, 可以成功看到修改记录.
glol filename #可以看到和这个文件有关的所有提交, 这个是概要列表, 没有每次的具体修改.
查看所有被git忽略的文件.
git ls-files –others -i –exclude-standard # - 一句话解决问题:
git log直接查看历史修改记录更麻烦的做法.
glol -p filename #好的, 可以成功看到修改记录.
glol filename #可以看到和这个文件有关的所有提交, 这个是概要列表, 没有每次的具体修改.
```
参考
- http://www.cnblogs.com/mengdd/archive/2013/04/11/3013843.html
git 全部快捷键
参见: 2016-09-20-zsh的git快捷键