提交代码前—rebase操作
背景
当多人开发一个工程的是时候,个人提交代码前一定要进行rebase操作。rebase的意义就是把自己的提交(commit)先取消,然后拉取(pull)最新远程分支(最新的远程分支可能包含本地没有的提交记录),之后把自己的提交应用到这个新的远程分支上,git的历史记录就没有merge操作。
如何操作
- 最简洁的方法
git pull --rebase
,命令的意义就是拉取最新的远程分支,并进行rebase操作。 - 还有另一种操作方式,麻烦一些
git remote update //查看远程更新的情况
git rebase //rebase操作
git push //提交本地的commit记录到远程分支,这也不会产生merge操作
推送最后一次修改(HEAD)到远程仓库
git push origin HEAD:refs/for/$(git branch --show-current)
。把最后一次修改(HEAD)推送到远程仓库$(git branch --show-current)
这个是使用命令自动获取当前本地分支名字。
git本地分支和远程分支关联
为什要关联
- 把本地git工程和已存在的远程git库(远程库可能有提交)关联。这里的关联其实是指定远程追踪分支。让
git push
和git pull
后面不用加参数即可把本地分支推送到远程分支。在本地工程没有关联远程分支的情况下需要git push origin master
来推送本地分支(master)到远程分支(origin)。
如何操作
- 本地分支名称master,远程分支地址:URL
git remote add origin URL
,首先把URL代表的远程库添加为本地库的一个远程库,并把它命名为origingit pull --rebase origin master
,这里进行rebase操作是防止远程库已有提交,如果直接git push
,git会提示失败,“远程库有本地没有的提交”。git push --set-upstream origin master
。至此,以后push和pull操作就可以直接git push
或者git pull
完成了。这个指令完成了下面几个操作:
--set-upstream
建立本地分支与远程库的关联,就是把远程库中的分支设定为远程追踪分支- 参数origin是指远程库,master是要推送的本地分支。如果远程库中没有同名分支(这里是master),就会在远程库中建立master分支。
关于push推送非同名远程分支的指令
git push origin master:dev
这个命令的意思是把本地分支master推送到origin中的远程分支dev,如果远程库中没有dev分支,则新建dev分支。不过并不建议这么操作,开发中最好还是让本地分支和远程分支同名。(注意冒号前不要加空格,否则这个命令会删除远程dev分支,我也不是很清楚这是什么骚操作)git push origin master dev
这个命令的意思是把本地分支master和本地分支dev推送到远程对应分支,如果远程库不存在对应分支,则新建分支。
Android studio中git记录中颜色的意义
- 蓝色代表在已有的代码上的修改
- 青绿色代表添加新的行
- 白色代表删除代码行
git配置push、pull的默认密码
背景
在用git想公司代码库提交代码的时候,每次git push
和git pull
总会让我输入账号和密码,每次输入就很麻烦,进行下面的配置就可以解决问题,配置默认密码。另外,本次配置只记录了Linux下的配置方法,网上还有很多Windows下的配置,百度就OK了。
如何操作
touch .git-credentials
在个人home目录下,建立 .git-credentials 这个文件。gedit .git-credentials
或者vi .git-credentials
https://username:password@github.com
把这行添加到上面的文件中。@后面是远程代码库网址,不用www之类的全称,像上面github那样就可以。如果不止一个代码库网址,就在下面添加同样的新行配置另一个网址,例如https://username:password@gitlab.com
。git config --global credential.helper store
执行完这个指令,密码配置就做好了。打开home目录下的.gitcofig文件,应该就能发现多了:
[credential]
helper = store
git reset
git中几个概念:
- 工作区(working tree)。文件修改后,在被
git add .
之前,文件是处于工作区的,此时git diff是可以看见文件的修改,git status
看到的文件状态是unstaged 状态。 - 暂存区(index)。
git add .
会将修改的文件存入暂存区。因为英语用index表示,也可以叫做索引区。git status
看到的文件状态时等待提交。git add .
操作也可以叫做stage changes。暂存修改。 - 版本库。所有的历史commit记录。
git reset --mixed/hard/soft [commit id]
git reset --mixed
和git reset
。git reset --mixed
是reset 无参数时的默认操作。这个操作会将暂存区(index)的修改文件reset到工作区(working tree)。变为unstage状态。文件的修改不变。如果git reset 之后加上commit id,那么会把当前的HEAD指向该commit id,当前的文件内容不变,commit id之后的修改全部进入工作区git reset --hard
。回退工作区(working tree)和暂存区(index)的文件修改。此时所有的文件修改都会被删除,并且不可找回。git reset --soft
。可以回退到指定的旧的commit id,HEAD也指向该commit id,此时文件内容完全不变。旧的commit id 此次之后的修改都会被退回到index暂存区中。此时可以重新commit,在本地被回退掉的commit不在git log
中展示。
在commit时添加注释模板
在默认的git中,在执行git commit
之后,会进入添加注释的界面.我们可以添加一个默认的注释模板.
实现方法
- 在home目录下
vi .gitmsg_sh
- 添加日志模板.例如
Description:
Team:
Feature or Bugfix: - 在命令行中执行
git config --globa commit.template ~/.gitmsg_sh
,配置完成
更改git 的默认文本编辑器
- 在home目录中的.bashrc文件中增加
export GIT_EDITOR= vim
git diff、git apply
git diff
生成pathgit apply --check xxxx.patch
检查当前的patch是否可以应用到git仓中,是否会出现冲突git apply --reject xxxx.patch
即使存在冲突,也将path 应用到git仓中,如果存在冲突,会生成冲突文件,需要手动解冲突。git format-patch
、git am
用于生成、应用patch,这两个命令的优点是可以保存提交者的commit信息。
查看历史修改
git show
展示最近一次修改详细内容。git show [commitId]
展示指定的commitId的修改内容git whatchanged
展示最近修改的文件列表。git whatchanged [commitId]
展示指定commitId的修改文件列表。git log -p [filename]
展示某个文件的所有更改记录git blame [filename]
查看文件的每一行的修改历史git blame [filename] -L 1320,+10
查看文件在1320行,向下10行的修改日志
其他
git reflog --date=iso
显示日期的reflog