git config -l
复制代码
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global --list
#查看当前仓库配置信息
git config --local --list
复制代码
配置文件位置linux
--system
系统级:(windows) <GIT安装目录>\Git\mingw64\etc\gitconfig
,(linux) /etc/gitconfig
git
--global
用户级:(windows) <用户目录>\.gitconfig
,(linux)~/.gitconfig
web
--local
仓库级:<项目目录>\.git\config
shell
注意:对于同一配置项,三个配置文件的优先级是system < global < local
windows
设置用户名称和
Git
提交都会使用该信息,它被永远的嵌入到了提交中。bash
git config --global user.name "XXX" #名称
git config --global user.email XXX@XXX.com #邮箱
复制代码
注意:--global
为全局配置,不加为某个项目的特定配置。服务器
建立全新仓库,在项目的根目录执行指令,会在项目目录产生.git目录markdown
# 在当前目录新建一个Git代码库
git init
复制代码
建立和使用本地库完整示例app
#一、建立目录
mkdir project7
#二、进入目录
cd project7
#三、初始化目录为git项目
git init
#四、建立md文件追加内容# project7(一级标题)
echo "# project7" >> README.md
#五、添加说明文件到暂存区
git add README.md
#六、提交到本地仓库并写日志
git commit -m "first commit"
#七、添加远程主机,主机名为origin 地址为https://git.xxx.com/xxx.git
git remote add origin https://git.xxx.com/xxx.git
#八、本地的master分支推送到origin主机,同时指定origin为默认主机,后面就能够不加任何参数使用git push了,-u 参数指定一个默认主机
git push -u origin master
复制代码
将远程服务器上的仓库彻底镜像一份至本地ssh
# 克隆一个项目和它的整个代码历史(版本信息)
git clone [url]
复制代码
原理:
#查看指定文件状态
git status [filename]
#查看全部文件状态
git status
复制代码
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的全部文件到暂存区
git add .
复制代码
经过add只是将文件或目录添加到了index暂存区,使用commit能够实现将暂存区的文件提交到本地仓库。
# 提交暂存区到仓库区
git commit -m [message]
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
# 提交工做区自上次commit以后的变化,直接到仓库区,跳过了add,对新文件无效
git commit -a
# 提交时显示全部diff信息
git commit -v
# 使用一次新的commit,替代上一次提交
# 若是代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 重作上一次commit,并包括指定文件的新变化
git commit --amend [file1] [file2] ...
复制代码
原理:
#修订提交
git commit --amend
复制代码
原理:
撤销提交有两种方式:使用
HEAD
指针和使用commit id
在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,咱们使用"HEAD^",那么再钱一个版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEADn"。(也就是,HEAD^=HEAD1,HEAD^^=HEAD~2)
# 撤销上一次的提交,原理就是放弃工做区和暂存区的改动,同时HEAD指针指向前一个commit对象
git reset --hard HEAD~1
git reset --hard HEAD^
git reset --hard 59cf933
复制代码
原理:
注:git reset –-soft
和git reset --hard
的区别在于:–-soft回退到某个版本,只回退了commit的信息,不会恢复到index file一级。若是还要提交,直接commit便可;-–hard完全回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉。
# 增长一条新的 `commit`,它的内容和倒数第二个 `commit` 是相反的,从而和倒数第二个 `commit` 相互抵消,达到撤销的效果。
git revert HEAD^
复制代码
# 查看提交日志
git log
# 以图形化的方式显示提交历史的关系
git log --graph
# 显示1行
git log -1
# 一个提交一行显示
git log --oneline
# 显示全部更新记录,包括已经撤销的更新
git reflog
# 显示commit历史,以及每次commit发生变动的文件
git log --stat
# 显示指定文件相关的每一次diff
git log -p [file]
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[filename]
# 显示指定文件是什么人在什么时间修改过
git blame [file]
复制代码
# 暂存区的目录树会被重写,被当前分支指向的目录树所替换,可是工做区不受影响。
git reset HEAD <file>
复制代码
# 用暂存区指定的文件替换工做区的文件。
git checkout -- <file>
复制代码
# 用HEAD 指向的分支中的文件替换暂存区和以及工做区中的文件
git checkout HEAD <file>
复制代码
若是文件仍是未跟踪状态,直接删除文件就可了,bash中使用rm能够删除文件。
# 从暂存区删除文件,工做区物理文件则不作出改变
git rm --cached <file>
# 不但从暂存区中删除,同时删除工做区物理文件
git rm <file>
复制代码
用"git status"只能查看对哪些文件作了改动,若是要看改动了什么,能够用:
# 查看文件修改后的差别
git diff <file>
# 比较暂存区的文件与以前本地仓库中已经提交过的文件差别
git diff --cached <file>
# 比较本地仓库中已经提交过的文件与工做空间中的文件差别
git diff HEAD <file>
# 显示分支之间的差别
git diff [first-branch]...[second-branch]
复制代码
# 检出branch分支。更新HEAD以指向branch分支,以及用branch指向的树更新暂存区和工做区。
git checkout branch
# 汇总显示工做区、暂存区与HEAD的差别。
git checkout
# 同上
git checkout HEAD
# 用暂存区中filename文件来覆盖工做区中的filename文件。至关于取消自上次执行git add filename以来(若是执行过)的本地修改。
git checkout -- filename
# 维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工做区中相应的文件。注意会将暂存区和工做区中的filename文件直接覆盖。
git checkout branch -- filename
# 注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消全部本地的 #修改(相对于暂存区)。至关于用暂存区的全部文件直接覆盖本地文件,不给用户任何确认的机会!
git checkout -- . 或写做 git checkout .
# 若是不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。
git checkout commit_id -- file_name
复制代码
- 当不想把某些文件归入版本控制中,在主目录下创建".gitignore"文件。
- 该文件只能做用于 Untracked Files,也就是那些历来没有被 Git 记录过的文件(自添加之后,从未 add 及 commit 过的文件)。
- 若是文件曾经被 Git 记录过,那么.gitignore 就对它们彻底无效。
将目前还不想提交的可是已经修改的内容进行保存至堆栈中,包括工做区和暂存区中的内容,后续能够在某个分支上恢复出堆栈中的内容。
# 将全部未提交的修改(工做区和暂存区)保存至堆栈中,用于后续恢复当前工做目录。
git stash
# 查看当前stash中的内容。
git stash list
# 查看堆栈中最新保存的stash和当前目录的差别。
git stash show
# 将当前stash中的内容弹出,并应用到当前分支对应的工做目录上。堆栈中的内容会删除。
git stash pop
# 将堆栈中的内容应用到当前目录,不一样于git stash pop,该命令不会将内容从堆栈中删除。
git stash apply
# 从堆栈中移除某个指定的stash
git stash drop + 名称
# 清除堆栈中的全部内容。
git stash clear
复制代码
获取某一个分支的某一次提交,并做为一个新的提交引入到当前分支上。
git cherry-pick <commit-id>
# 停止cherry-pick
git cherry-pick --abort
复制代码
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 新建一个分支,指向指定commit
git branch [branch] [commit]
# 新建一个分支,与指定的远程分支创建追踪关系
git branch --track [branch] [remote-branch]
复制代码
原理:
# 列出全部本地分支
git branch
# 列出全部远程分支
git branch -r
# 列出全部本地分支和远程分支
git branch -a
# 查看本地分支和远程分支的映射关系
git branch -vv
复制代码
# 切换到指定分支,并更新工做区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
复制代码
原理:
# 合并指定分支到当前分支
git merge [branch]
# 合并指定分支到当前分支
git merge [branch]
# 取消合并
git merge --abort
复制代码
合并原理:
从目标 commit
和当前 commit
(即 HEAD
所指向的 commit
)分叉的位置起,把目标 commit
的路径上的全部 commit
的内容一并应用到当前 commit
,而后自动生成一个新的 commit
。
例以下面这个图中:
HEAD
指向了 master
,因此若是这时执行:
git merge branch1
复制代码
Git 会把 5
和 6
这两个 commit
的内容一并应用到 4
上,而后生成一个新的提交,并跳转到提交信息填写的界面:
merge
操做会帮你自动地填写简要的提交信息。在提交信息修改完成后(或者你打算不修改默认的提交信息),就能够退出这个界面,而后此次 merge
就算完成了。
# 删除分支
git branch -d [branch-name]
# 强制删除分支
git branch -D [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
复制代码
原理:
# 创建追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]
git push --set-upstream [origin] [remote-branch]
git push -u [origin] [remote-branch]
复制代码
https://xxx.com/xxx/xxxx.git
使用加密的网页访问通道读写仓库,使用用户名及密码进行鉴权。
git@xxx.com/xxx/xxxx.git
使用加密通道读写仓库,无单次上传限制,需先设置 “帐户 SSH 公钥”,完成配对验证。
# 会在<用户目录>\.ssh目录下生成id_rsa和id_rsa.pub两个文件
ssh-keygen -t rsa -C "你的邮箱地址"
复制代码
将id_rsa.pub里的内容拷贝到git网站里的添加公钥
中。
# 以码云为例,验证设置是否能够链接
ssh -T git@gitee.com
复制代码
# 显示全部远程仓库
git remote -v
# 显示某个远程仓库的信息
git remote show [remote]
# 增长一个新的远程仓库,并命名
git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 强行推送当前分支到远程仓库,即便有冲突
git push [remote] --force
# 推送全部分支到远程仓库
git push [remote] --all
# 简单查看远程---全部仓库
git remote (只能查看远程仓库的名字)
# 查看单个仓库
git remote show [remote-branch-name]
# 新建远程仓库
git remote add [branchname] [url]
# 修改远程仓库
git remote rename [oldname] [newname]
# 删除远程仓库
git remote rm [remote-name]
# 获取远程仓库数据
git fetch [remote-name] (获取仓库全部更新,但不自动合并当前分支)
git pull (获取仓库全部更新,并自动合并到当前分支)
# 上传数据,如git push origin master
git push [remote-name] [branch]
复制代码
为了便于管理,Git要求每一个远程主机都必须指定一个主机名。
git remote
命令就用于管理主机名。默认主机名为origin。
# 不带选项的时候,git remote命令列出全部远程主机。
git remote
# 使用-v选项,能够参看远程主机的网址。
git remote -v
# 查看该主机的详细信息。
git remote show <主机名>
# 添加远程主机。
git remote add <主机名> <网址>
# 删除远程主机。
git remote rm <主机名>
# 远程主机更名
git remote rename <原主机名> <新主机名>
复制代码
一旦远程主机的版本库有了更新(Git术语叫作commit),须要将这些更新取回本地,这时就要用到
git fetch
命令。
# 将远程主机的更新,所有取回本地
git fetch <远程主机名>
# 取回特定分支的更新
git fetch <远程主机名> <分支名>
复制代码
示例:
origin
主机的master
分支。git fetch origin master
复制代码
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。好比origin
主机的master
,就要用origin/master
读取。
git branch -r
origin/master
git branch -a
* master
remotes/origin/master
复制代码
上面命令表示,本地主机的当前分支是master
,远程分支是origin/master
。
git checkout
命令建立一个新的分支。# 在origin/master的基础上,建立一个新分支
git checkout -b newBrach origin/master
复制代码
# 在当前分支上,合并origin/master
git merge origin/master
# 在当前分支上,合并origin/master(变基)
git rebase origin/master
复制代码
取回远程主机某个分支的更新,再与本地的指定分支合并。
# 合并须要采用merge模式
git pull <远程主机名> <远程分支名>:<本地分支名>
# 合并须要采用rebase模式
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
复制代码
注:若是远程主机删除了某个分支,默认状况下,git pull
不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,因为其余人操做了远程主机,致使git pull
不知不觉删除了本地分支。
示例:**
origin
主机的next
分支,与本地的master
分支合并,须要写成下面这样。git pull origin next:master
复制代码
# 取回origin/next分支,再与当前分支合并
git pull origin next
# 等同于先作git fetch,再作git merge
git fetch origin
git merge origin/next
复制代码
注:在某些场合,Git会自动在本地分支与远程分支之间,创建一种追踪关系(tracking)。好比,在git clone
的时候,全部本地分支默认与远程主机的同名分支,创建追踪关系,也就是说,本地的master
分支自动"追踪"origin/master
分支。
git branch --set-upstream master origin/next
复制代码
git pull
就能够省略远程分支名。# 本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并
git pull origin
复制代码
# 当前分支自动与惟一一个追踪分支进行合并
git pull
复制代码
原理:
git push
命令用于将本地分支的更新,推送到远程主机。它的格式与git pull
命令相仿。
git push <远程主机名> <本地分支名>:<远程分支名>
复制代码
注意:
分支推送顺序的写法是<来源地>:<目的地>,因此
git pull
是<远程分支>:<本地分支>,而git push
是<本地分支>:<远程分支>。若是省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(一般二者同名),若是该远程分支不存在,则会被新建。
在git的全局配置中,有一个push.default属性,其决定了git push操做的默认行为。push.default 有几个可选值:nothing, current, upstream, simple(默认), matching
- nothing - push操做无效,除非显式指定远程分支,例如git push origin develop
- current - push当前分支到远程同名分支,若是远程同名分支不存在则自动建立同名分支。
- upstream - push当前分支到它的upstream分支上(这一项其实用于常常从本地分支push/pull到同一远程仓库的情景,这种模式叫作central workflow)。
- simple(默认) - simple和upstream是类似的,只有一点不一样,simple必须保证本地分支和它的远程 upstream分支同名,不然会拒绝push操做。只推送当前分支。
- matching - push全部本地和远程两端都存在的同名分支。推送全部有对应的远程分支的本地分支。
示例:
master
分支推送到origin
主机的master
分支。若是后者不存在,则会被新建。git push origin master
复制代码
# 删除origin主机的master分支
git push origin :master
# 等同于
git push origin --delete master
复制代码
# 将当前分支推送到origin主机的对应分支
git push origin
复制代码
git push
复制代码
-u
选项指定一个默认主机,这样后面就能够不加任何参数使用git push
。# 将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就能够不加任何参数使用git push了。
git push -u origin master
复制代码
--all
选项。# 将全部本地分支都推送到origin主机
git push --all origin
复制代码
git pull
合并差别,而后再推送到远程主机。这时,若是你必定要推送,可使用--force
选项。git push --force origin
复制代码
**注:**使用--force
选项,结果致使远程主机上更新的版本被覆盖。除非你很肯定要这样作,不然应该尽可能避免使用--force
选项。
git push
不会推送标签(tag),除非使用--tags
选项。git push origin --tags
复制代码
原理解析:把 branch 上传到远端仓库
实质上,push
作的事是:把当前 branch
的位置(即它指向哪一个 commit
)上传到远端仓库,并把它的路径上的 commit
s 一并上传。
例如,如今的本地仓库有一个 master
,它超前了远程仓库两个提交;另外还有一个新建的 branch
叫 feature1
,远程仓库尚未记载过它。具体大概像这样:
这时我执行 git push
,就会把 master
的最新位置更新到远端,而且把它的路径上的 5
6
两个 commit
s 上传:
git push
复制代码
而若是这时候我再切到 feature1
去后再执行一次 push
,就会把 feature1
以及它的 commit
4
上传到远程仓库:
git checkout feature1
git push origin feature1
复制代码
tag是git版本库的一个标记,指向某个commit的指针。
# 在当前 commit 上建立标签
git tag <tagname>
# 建立带注释的标签,弹出编辑器输入注释
git tag -a <tagname>
# 指定提交节点建立分支
git tag <tagname> <commit>
# 建立指定注释的标签
git tag -a <tagname> -m '注释信息'
git tag -a -m '注释信息' <tagname>
# 建立带签名的标签
git tag -s <tagname>
git tag -u <keyid> <tagname>
# 强制打标签(无论命名冲突)
git tag <tagname> -f
复制代码
# 查看全部标签
git tag
git tag -l
git tag -n
# 查看tag 指向commit 的修改信息
git show <tagname>
git show <commit>
复制代码
# 删除本地tag
git tag -d <tagname>
# 删除远程tag
git push origin --delete tag <tagname>
# 删除本地和远程tag(经过推送空tag 到远程)
git tag -d <tagname>
git push origin :refs/tags/<tagname>
复制代码
# 推送tag 到远程
git push --tags
# 推送指定的tag 到远程
git push origin <tagname>
# 拉取远程tag
git fetch origin tag <tagname>
复制代码