文章目录
1. gitignore
git .gitignore 文件只能够忽略 untracked file ,对于已经 tracked 的文件,再加入 .gitignore 文件中是无效的。
若想忽略已经 tracked 的文件,可采取如下方式:
- git rm --cached a.conf;将 a.conf 加入到 .gitignore 中,然后 commit & push
- git update-index --assume-unchanged a.conf
Note:此种方式适用于你对某个文件做了修改,但仅限于 local branch。
git update-index --no-assume-unchanged a.conf
命令可将 changes 释放出来。
.gitignore 过滤规则
- 所有的空行和 # 开头的行都会被 git 忽略(相当于不读取)
- 匹配模式最后跟反斜杠(/),说明要忽略的是目录
- 以 ! 来忽略指定模式以外的文件或目录(保守模式)
- 使用标准的 glob 模式匹配(shell 所使用的简化的正则表达式)
标准的 glob 模式匹配:
- 匹配零个或多个任意字符;
[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
? 只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
# 忽略以 .a 或 .o 结尾的文件
*.[oa]
# 第二、三、四、五行告诉git忽略以~、swp、bak、DS_Store结尾的文件
*~
*.swp
*.bak
*.DS_Store
# 忽略logs目录下的所有文件
logs/*
# 忽略以a结尾的文件
*.a
# 跟踪core.a
!core.a
# 忽略根目录下的 config文件,但 /abc/config 不会被忽略
/config
# 忽略logs目录
logs/
# 忽略doc目录下所有以pyc结尾的文件,但不包括 doc/abc/*.pyc
doc/*.pyc
# 忽略doc目录下所有以pyc结尾的文件,包括 doc/abc/*.pyc
doc/**.pyc
# 这两行表示只跟踪根目录下的www中的base目录
/www/*
!/www/base/
建立全局的过滤规则
在用户目录下新建一个 .gitignore
文件并添加过滤规则:
vim ~/.gitignore
添加过滤规则…,然后执行
git config --global core.excludesfile ~/.gitignore
对于配置文件,git 中可采取如下的方式配置:
remote repository 保存的应该是 a.conf.example 文件,当我们 clone 下来后,cp a.conf.example a.conf,再对 a.conf 进行修改,而 a.conf 应该是 git ignore 的。
2 . cherry-pick
git cherry-pick 用于把另一个本地分支的 commit 修改应用到当前分支。
Note:此命令只会合并当前 commit id 所修改的内容
usage:git cherry-pick <commit id>
3. log
git log
用于查看版本的提交记录。
usage:
git log --pretty=format:"%H , %an , %ar : %s" --stat -1
git log -p -1
4. reset & revert
reset
与 revert
的区别在于一个主要用于本地版本的回滚一个用于 remote server 上的回滚。
- reset
usage:git reset --hard commit_id
Tips:可以使用
git reflog
命令来查看命令历史,以便回到回滚之前的版本。
- revert
usage:git revert commit_id
Note:git revert 使用一次新的 commit 来回滚之前的 commit,所以 HEAD 是一直往前的;而 git reset 是直接删除指定的 commit ,HEAD 是向后移动的。
5. diff
- 查看尚未暂存的文件更新了哪些部分。
git diff
- 查看已暂存起来的文件和上次提交快照(HEAD)之间的差异。
git diff --cached
- 显示工作版本和 HEAD 的差异。
git diff HEAD
- 显示当前目录和另一个分支的差别。
git diff master
- 显示目录下的某个目录和另一个分支的差别。
git diff HEAD -- ./lib
6. stash
git stash save "some message"
# save uncommited changes
git stash list
# list stashed changes
git stash show stash@{n}
# see stash change
git stash apply/pop stash@{n}
# apply stash and remove it from the list
git stash drop stash@{n}
# drop stash changes
git stash clear
# clear all stash changes
git stash branch <branchname> stash@{n}
# create branch base on stash
7 Git clone | init
克隆一个版本库,需要使用 git clone 命令:
git clone <版本库的网址> <本地目录名>
创建一个空的版本库或者重新初始化一个已存在的目录
git init
8 Git remote
为了便于管理,Git 要求每个远程主机都必须指定一个主机名,git remote 命令就用于管理主机名。
- 查看远程主机的网址
git remote -v
- 克隆远程仓库时指定远程主机名
git clone -o jquery https://github.com/jquery/jquery.git
- 查看远程主机的详细信息
git remote show <远程主机名>
- 添加远程主机
git remote add <主机名> <网址>
- 删除远程主机
git remote rm <主机名>
重命名
git remote rename <主机名>
9 Git pull
git pull 命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
完整格式:
git pull <主机名> <远程分支名>:<本地分支名>
若省略本地分支名,则表示默认与当前分支合并。
在某些场合下,Git 会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在 git clone 的时候,所有的本地分支默认与远程分支的同名分支就,建立追踪关系。
Git 也允许手动建立追踪关系
git branch --set-upstream <本地分支名> <主机名>/<远程分支名>
如果当前分支与远程分支存在追踪关系,git pull 就可以省略远程分支名
git pull origin
如果当前分支只有一个追踪分支,连远程主机名都可以省略
git pull
10 git push
git push 用于将本地分支的更新,推送到远程主机。
git push <主机名> <本地分支>:<远程分支>
- 如果省略远程分支,则表示将本地分支推送到与之有追踪关系的远程分支(通常两种同名),如果该远程分支不存在,则会被新建。
git push origin master
如果省略本地分支和远程分支,表示将当前分支推送到与之有追踪关系的远程分支上。
git push origin
如果省略本地分支而远程分支存在,则表示删除指定的远程分支。
git push origin :master
如果当前分支只存在一个追踪分支,那么主机名也可省略。
git push
11 git branch
git clone只能clone远程库的master分支,无法clone所有分支,解决办法如下:
- 找一个干净目录,假设是git_work
- cd git_work
- git clone http://myrepo.xxx.com/project/.git ,这样在git_work目录下得到一个project子目录
- cd project
- git branch -a,列出所有分支名称如下
- git checkout -b dev origin/dev,作用是checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
- git checkout dev,切换回dev分支,并开始开发。
12 Git: ERROR: Permission to repo.git denied to user
Git: ERROR: Permission to repo.git denied to user
13 Git Tag
14 带用户名密码检出 Repository
git clone https://user:[email protected]/{repository_url}