标签 git 下的文章

git reset --hard和git clean -f是一对好基友
结合使用他们能让你的工作目录完全回退到最近一次commit的时候

git clean 从工作目录删除所有没有tracked过的文件

reset只影响被track过的文件, 所以需要clean来删除没有track过的文件
结合使用这两个命令能让你的工作目录完全回到一个指定的的状态

用法

git clean -n

是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒

git clean -f

删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过

git clean -f

删除指定路径下的没有被track过的文件

git clean -df

删除当前目录下没有被track过的文件和文件夹

git clean -xf

删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件

git clean对于刚编译过的项目也非常有用.
能轻易删除掉编译后生成的.o和.exe等文件.
这个在打包要发布一个release的时候非常有用

下面的例子要删除所有工作目录下面的修改, 包括新添加的文件. 假设你已经提交了一些快照了, 而且做了一些新的开发

git reset --hard
git clean -df

自摘: 林德熙博客 http://blog.csdn.net/lindexi_gd

在合并pull两个不同的项目,会出现的问题: refusing to merge unrelated histories

先pull,因为两个仓库不同,发现refusing to merge unrelated histories

无法pull

因为他们是两个不同的项目,要把两个不同的项目合并,git需要添加一句代码,在git pull,这句代码是在git 2.9.2版本发生的,最新的版本需要添加--allow-unrelated-histories

假如我们的源是origin,分支是master,那么我们 需要这样写

git pull origin master --allow-unrelated-histories

需要知道,我们的源可以是本地的路径

我们可以通过git version确定当前的git版本(如果小于2.0,更新是个更好的选择),通过
git config --global push.default [option]
改变push.default的默认行为(或者也可直接编辑~/.gitconfig文件)。

push.default 有以下几个可选值:
nothing, current, upstream, simple, matching

其用途分别为:

nothing - push操作无效,除非显式指定远程分支,例如git push origin develop(我觉得。。。可以给那些不愿学git的同事配上此项)。

current - push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支。

upstream - push当前分支到它的upstream分支上(这一项其实用于经常从本地分支push/pull到同一远程仓库的情景,这种模式叫做central workflow)。

simple - simple和upstream是相似的,只有一点不同,simple必须保证本地分支和它的远程 upstream分支同名,否则会拒绝push操作。

matching - push所有本地和远程两端都存在的同名分支

git pull
弄清楚git push的默认行为后,再来看看git pull。

当我们未指定当前分支的upstream时,通常git pull操作会得到如下的提示:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> new1

git pull的默认行为和git push完全不同。
当我们执行git pull的时候,实际上是做了git fetch + git merge操作,fetch操作将会更新本地仓库的remote tracking,也就是refs/remotes中的代码,并不会对refs/heads中本地当前的代码造成影响。

当我们进行pull的第二个行为merge时,对git来说,如果我们没有设定当前分支的upstream,它并不知道我们要合并哪个分支到当前分支,所以我们需要通过下面的代码指定当前分支的upstream:

git branch --set-upstream-to=origin/ develop
// 或者git push --set-upstream origin develop
实际上,如果我们没有指定upstream,git在merge时会访问git config中当前分支(develop)merge的默认配置,我们可以通过配置下面的内容指定某个分支的默认merge操作

[branch "develop"]
remote = origin
merge = refs/heads/develop // [1]为什么不是refs/remotes/develop?

或者通过command-line直接设置:

git config branch.develop.merge refs/heads/develop
这样当我们在develop分支git pull时,如果没有指定upstream分支,git将根据我们的config文件去merge origin/develop;如果指定了upstream分支,则会忽略config中的merge默认配置。

以上就是git push和git pull操作的全部默认行为,如有错误,欢迎斧正

git 操作方法笔记

自动补全
git --version
下载对应版本的文件:
https://raw.githubusercontent.com/git/git/v2.22.0/contrib/completion/git-completion.bash

如果你用的是 Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入 contrib/completion 目录,会看到一个 git-completion.bash 文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash),并把下面一行内容添加到你的 .bashrc 文件中:

source ~/.git-completion.bash

保存账号密码
git config --global credential.helper store

忽略本地文件权限修改
git config core.fileMode false

tag标签
git tag xxxx [-m xxxxx]
git show xxxx
git push origin xxxx
推送本地所有标签到远程仓库
git push origin [--tags]

删除本地仓库中的文件
git rm与git rm --cached

当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用
1 git rm file_path
2 git commit -m 'delete somefile'
3 git push
当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 可以使用
git rm --cached file_path
git commit -m 'delete remote somefile'
git push

本地修改不提交到远程仓库

git update-index --assume-unchanged index.jsp
取消本地忽略
git update-index --no-assume-unchanged index.jsp
查看本地仓库哪些文件被加入忽略列表

恢复跟踪

git update-index --no-assume-unchanged   sp_edaijia/protected/controllers/ApiController.php  //恢复跟踪

如果忽略的文件多了,可以使用以下命令查看忽略列表

git ls-files -v | grep '^h\ '

提取文件路径,方法如下

git ls-files -v | grep '^h\ ' | awk '{print $2}'

所有被忽略的文件,取消忽略的方法,如下

git ls-files -v | grep '^h' | awk '{print $2}' |xargs git update-index --no-assume-unchanged  

查找历史代码片段

git log -G 正则 -p
git log -s 文件名