.gitignore
指定 Git 忽略的文件。
当我们执行 git status 后,会列出未跟踪的文件。然而有的文件我们不希望提交到 Git,为此我们可以添加 .gitignore 文件,指定排除哪些文件。
例如,要排除 VisualStudio 编译后产生的二进制文件,以及其它无关文件,就可以使用 .gitignore。为此 GitHub 提供了很多 .gitignore 模板。
.gitattributes
GitHub 会在你的项目上传后自动分析它是由何种语言编写,然后给出一个统计结果,如 C 40%, Java 55%, XML 5%.有时候我们希望进行干预,创建 .gitattributes 文件,加入
*.c linguist-language=C++
这样所有 .c 文件都会被识别为 C++。此外,还可以用 Git 属性让其知道哪些是二进制文件(以防 Git 没有识别出来),以及指示怎样处理这些文件。
.gitsubmodule
如果当前项目依赖其他Git项目,执行:
git submodule add https://github.com/example/test.git ./path/
该命令会创建一个 .submodule
文件。
为了递归地拉取仓库,执行:
git submodule update --init --recursive
自定义Git
DOS 行尾
在 Windows 和 Unix 切换时会出现行尾的问题。解决方案是在 Windows 执行:
git config --global core.autocrlf true
在 Linux 执行
git config --global core.autocrlf input
忽略权限
文件权限也是 Git 关心的一部分,可以关闭对文件权限变更的检查
git config core.filemode false
撤销修改
想让已经修改的某个文件回到上一次提交时的状态:
git checkout 文件名
取消暂存
git reset HEAD 文件名
修改最新commit的注释
git commit --amend
文件名区分大小写
git config core.ignorecase false
push 记住密码
git config --global user.name yourusername
git config --global user.email your@email.com
git config --global credential.helper store
Git 打包压缩文件
git archive --format=zip --output master.zip master
推送本地分支到远端
git push origin your_local_branch:your_remote_branch
多个上游仓库
假设你打算对一个知名的开源项目进行一些修改,并通过你的私有仓库托管。这时你需要在你的私有仓库(譬如 GitLab)中创建一个项目。接下来克隆远程仓库并推送到你的私有仓库:
git clone git@github.com:example/example.git
cd example
git remote add upstream git@your_domain.com:example/example.git
git push -u upstream master
我们希望在一个自己的分支上进行操作,并将其关联到你的私有仓库上:
git checkout -b work
git push --set-upstream upstream work
如果原始仓库存在更新,通过如下命令来拉取:
git remote update
打 tag
git tag -a v1.0 -m "first release"
git push origin v1.0
或者:git push --tags
删除远端tag
git tag -d tag-name
git push origin :refs/tags/tag-name
GIt stash
当你的开发进行到一半,但是代码还不想进行提交 ,然后需要同步去关联远端代码时使用:
git stash
git pull
git stash pop
Git Rebase
基于远程分支开发,然后远程分支更新了,为了提交到远程分支,传统做法是 commit,fetch origin
,merge。这种方式的缺点是,之后如果 push 的话,上游的历史记录就会看到你的这次 merge。
另一种方法是先 stash,然后 fetch origin
,git rebase orgin
让你的当前分支重新基于最新的远程分支,然后 commit。也可以用 git pull --rebase
,效果是一样的。
合并 commit
如果你切换到另外一个分支进行开发,在上面随意地 commit,之后你在将该分支合入一个主分支时,为了隐藏那些随意的中间 commit,应该使用 merge --squash
将诸多 commit 合并成一个。
另一种方法:
git reset 以前的某个commit
git add .
git commit
列出所有文件
git ls-files
清除所有未跟踪的文件
git clean -fd
合并其他分支的某一个提交
假设我们有个分支 v2.0,另外还有个开发版本的分支 v3.0,想增加一个 v3.0 中的功能到 v2.0 中,可以使用cherry-pick:
git checkout v2.0
git cherry-pick 38361a55
其中这个分支号位于位于v3.0分支中。 可以cherry-pick一个区间的commit:
git cherry-pick <start-commit-id>..<end-commit-id>
把 <start-commit-id>
到 <end-commit-id>
之间(左开右闭,不包含 start-commit-id
)的提交cherry-pick到当前分支;
git cherry-pick <start-commit-id>^..<end-commit-id>
把 <start-commit-id>
到 <end-commit-id>
之间(闭区间,包含start-commit-id
)的提交cherry-pick到当前分支。