忽略以前提交过的文件 git rm -r - -cached 文件名/目录名(- - cached 两个横线)
代码回滚到某个commit id,并且新建一个新的分支 git branch branchName commitId git branch thtx fa5d0a83f5d7a6f88a1fabdd0c4232fd6ed4cea9
查看当前tag ~: git tag
打tag -a为tag名字 -m为tag的说明 ~: git tag -a v4.0.3 -m "扫描库更换4.0.3"
把当前的tag们推送到远端 ~: git push origin --tags
删除远端tag(注意origin后面有一个空格) ~: git push origin :refs/tags/v4.0.2
删除远端分支 ~: git push origin :branch-name 冒号前面的空格不能少,原理是把一个空分支push到server上,相当于删除该分支
git stash list 查看当前stash
给stash起一个名字 git stash save -a "xxx" 这里的-a参数的意思是把没有加入暂存区的也一并纳入 要不然得先git add . 一把
恢复stash git stash pop stash@{xx} 或者git stash apply stash@{xx} apply和pop的区别是 pop完了之后会删除原来的stash而apply不会
清除所有stash git stash clear
删除指定id的stash git stash drop stash@{id} 如果直接执行git stash drop 默认删除最新那个stash.即stash@{0}
简而言之关于pull和rebase的区别就是显示在git log上 当你push被rejected的时候,通常都是pull再解决冲突再提交 这样的问题在于会生成一个其实没有任何实质操作的commit. 而使用rebase的方式是这样的 首先获取服务器上的最新数据 git fetch origin 然后变基当前的版本 git rebase origin/master 这个时候可能会有冲突,然后你正常的解决冲突 接着通过git add conflict的方式告诉git你已经解决好冲突了 最后执行git rebase --continue 最后直接push
git fetch origin git rebase origin/master
<<<<< HEAD //this is mine
//they are others from server
327fbabffdf8dc68daaf2cf5eb2870ebf33c920d
git fetch origin git rebase origin/master 解决冲突文件conflict.txt git add conflict.txt git rebase --continue
========2017-06-15 08:30======== 关于pull和rebase的问题 假设现在服务器最新的版本号是x 小A和小B都同时拉取了这个版本进行开发,但是现在小A先push到服务器上了, 小B并不知道小A已经push到服务器上了,也就是说现在小B的开发基于的并不是最新的. 所以小B此时如果push的话,是push不上去的,必须先从服务器上拉取最新的代码. 其实就是本地的.git/refs/remotes/origin目录下记录的不是最新的 该目录内容如下: -rw-r--r-- 1 lightman_mac staff 32B Oct 17 2016 HEAD -rw-r--r-- 1 lightman_mac staff 41B Jun 14 17:37 develop -rw-r--r-- 1 lightman_mac staff 41B Jun 9 13:44 master -rw-r--r-- 1 lightman_mac staff 41B Jun 9 13:48 release
对应的每个分支,文件的内容就是改分支上最新的版本号,如 » cat develop
3278b7c7f51802120b2dda1d98da78eea662afa0那么为了解决问题小B此时应该做的就是先拉去服务器上的最新的代码执行 git fetch origin
这个 origin是什么呢,只不过是远端仓库的一个别名
以下是cat .git/config文件的内容,可见origin是个什么东西 [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "origin"] url = :infra/new_customer_android.git fetch = +refs/heads/:refs/remotes/origin/ [branch "master"] remote = origin merge = refs/heads/master [branch "develop"] remote = origin merge = refs/heads/develop [branch "release"] remote = origin merge = refs/heads/release
通过fetch获取了服务器上的最新的代码了以后再执行 git rebase origin/master
根据单词的意思大概也能猜到是什么意思rebase,改变基础. 使得你现在的代码的基础是服务器上最新的代码,而不是你的老代码. 这个可以自己通过git log查看.
然后小B此时就可以push代码了.
至于为什么要fetch然后rebase而不是直接git pull呢? 答案通过git log可以比较直观的看出来. ========2017-06-15 08:30========
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法. 这个文件每一行保存了一个匹配的规则例如:
此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件 !lib.a # 但 lib.a 除外 /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目录下的所有文件 doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt这样设置了以后 所有的 .pyc 文件都不会添加到版本库中去.另外 git 提供了一个全局的 .gitignore,你可以在你的用户目录下创建 ~/.gitignoreglobal 文件,
以同样的规则来划定哪些文件是不需要版本控制的. 需要执行 git config --global core.excludesfile ~/.gitignoreglobal来使得它生效. 其他的一些过滤条件 * ?:代表任意的一个字符 * *:代表任意数目的字符 * {!ab}:必须不是此类型 * {ab,bb,cx}:代表ab,bb,cx中任一类型即可 * [abc]:代表a,b,c中任一字符即可 * [ ^abc]:代表必须不是a,b,c中任一字符 由于git不会加入空目录,所以下面做法会导致tmp不会存在 tmp/* //忽略tmp文件夹所有文件 改下方法,在tmp下也加一个.gitignore,内容为 * !.gitignore 还有一种情况,就是已经commit了,再加入gitignore是无效的,所以需要删除下缓存 git rm -r --cached ignore_file
注意: .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 正确的做法是在每个clone下来的仓库中手动设置不要检查特定文件的更改情况. git update-index --assume-unchanged PATH 在PATH处输入要忽略的文件.
另外 git 还提供了另一种 exclude 的方式来做同样的事情,不同的是 .gitignore 这个文件本身会提交到版本库中去.用来保存的是公共的需要排除的文件.而 .git/info/exclude 这里设置的则是你自己本地需要排除的文件. 他不会影响到其他人.也不会提交到版本库中去..gitignore 还有个有意思的小功能, 一个空的 .gitignore 文件 可以当作是一个 placeholder .当你需要为项目创建一个空的 log 目录时, 这就变的很有用. 你可以创建一个 log 目录 在里面放置一个空的 .gitignore 文件.这样当你 clone 这个 repo 的时候 git 会自动的创建好一个空的 log 目录了.