名词
-
Workspace 工作区
就是工作需要进行增加修改删除操作的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外)。 -
Index/Stage 暂存区
又叫缓存区 -
Repository本地仓库
工作区有一个隐藏目录.git
,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。 -
Remote 远程仓库
-
master 默认开发分支
-
origin 默认远程版本库
开始使用git
安装好Git后,配置用户名和用户邮箱,以后每次与Git的交互都会使用该信息。
your_name可以不跟github用户名一样
git config --global user.name "your_name"
git config --global user.email "your_email@gmail.com"
配置信息想要更改使用上面指令就可以。同时可以使用git config --list
指令查看Git的配置信息。Git默认是大小写不敏感的,也就是说,将一个文件名某个字母做了大小写转换的修改Git是忽略这个改动的,导致在同步代码时候会出现错误,所以建议大小把Git设置成大小写敏感。
git config core.ignorecase false
生成密钥
Git关联远程仓库时候需要提供公钥,本地保存私钥,每次与远程仓库交互时候,远程仓库会用公钥来验证交互者身份。使用以下指令生成密钥。
ssh-keygen -t rsa -C "your_email@youremail.com"
生成密钥后,在本地的/Users/当前电脑用户/.ssh
目录下会生成两个文件id_rsa
、id_rsa.pub
,id_rsa
文件保存的是私钥,保存于本地,id_rsa.pub
文件保存的是公钥,需要将里面内容上传到远程仓库。
查看你的public key
cat ~/.ssh/id_rsa.pub
远程仓库添加密钥
以GitHub为例子,向远程仓库添加公钥,上面已经获取到了公钥,只需要将公钥添加到远程仓库就可以了。
在个人设置页面,左边选中SSH and GPG keys,在右边添加公钥,title是key的名称,可以随便取,可更改,key是上面我们获取到的公钥,填写完毕后点击add SSH key按钮,这样远程就添加到了密钥。
添加后,在终端(Terminal)中输入
ssh -T git@github.com
若返回:Welcome to Gitee.com, 你的name!
,则配置成功。
若提示不正确错误:Are you sure you want to continue connecting (yes/no)?
输入yes继续回车就可以了。
然后在重复输入ssh -T git@gitee.com,回车则会提示正确。
本地新建仓库关联到远程
- 首先在github上创建个空项目,得到仓库的链接 (例如: https://github.com/xxx/xxx.git)
- 在本地文件夹下面执行终端命令
git init
,初始化文件夹,作为本地的一个仓库。 - 执行
git remote add origin 仓库的链接
- 执行
git pull
指令, 将远程代码拉取到本地(本地仓库里的文件不会被删掉, 不拉取,直接push会报错), 执行完毕后,远程仓库代码已经同步到了本地。 - 执行
git push -u origin master
,推送到远程仓库master分支
例子:
# 先在github上创建空项目, 仓库的链接 https://github.com/xxx/testGit.git
cd ~/testGit # 本地创建的项目名称文件夹 testGit
git init # 初始化为git仓库
git add . # 当前目录使用文件添加到暂存区
git commit -m "first commit" # 暂存区提交到本地仓库
git remote add origin https://github.com/xxx/testGit.git # 关联到远程仓库
git pull # 拉取远程仓库文件
git push -u origin master # 推送本地仓库文件和记录到远程仓库
clone远程项目
终端 进入准备放项目代码文件夹:
#cd ~/testGit
回车输入以下命令
git clone https://github.com/xxx/testGit.git
IDEA中本地新建项目托管到github或gitee
- IDEA 配置–> setting–>Version Control ->Git 配置Path to Git exectable 选择可执行的git程序
- idea 中新建一个项目
- 终端执行以下命令:
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/xxx/xxx.git
git push -u origin master
- 如果不出错误提示输入用户名, 密码:
Username for 'https://github.com':
配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
-
显示所有配置信息
git config --list
-
编辑git配置文件
git configuration -e [--global]
-
初始化配置
# 设置提交代码时的用户名和邮箱 #用户名可以不和github的用户名一样 git config --global user.name “Your Name” git config --global user.email "email@163.com" # 设置大小写敏感 git config core.ignorecase false
-
移除全局设置
git config --global --unset <entry-name>
-
给 git 命令起别名
git config --global alias.<handle> <command> 比如:git status 改成 git st,这样可以简化命令 git config --global alias.st status
创建项目
init命令
git init
:在本地初始化一个git仓库
clone命令
git clone <项目URL>
: 从远程服务器克隆一个仓库到本地
基本操作
add命令
git add <file>
:添加工作目录的文件到暂存区
status命令
git status
:显示工作树的状态,一般有三种状态
- Untracked files:未被跟踪的文件,表示是工作目录新增加的文件
- Changes not staged for commit:工作目录中修改了文件,但是没有被添加到暂存区
- Changes to be committed:添加到暂存区的文件,等待提交
commit命令
git commit -m "提交消息"
:提交暂存区的文件到本地仓库,带有提交消息
git commit -a -m "提交消息"
:跳过暂存区,直接提交工作目录中所有改变的文件到本地仓库,但是不能提交工作目录中新增的文件
git commit --author=haha -m "提交消息"
:提交暂存区的文件到本地仓库,并重写提交作者
git commit --date=08.13.2019T09:00:00 -m "提交消息"
:提交暂存区的文件到本地仓库,并重写提交日期
git commit --amend -m "提交消息"
:通过创建一个新的提交,以替换当前分支的上次的提交。如果你不满意上次的提交,可以修改掉之前写的日志。或者你提交以后,发现自己漏掉了一些东西,但是你不想多产生一次记录。已push到线上的记录不要使用这个命令去修改。
reset命令
git reset
:重置暂存区为当前分支的HEAD(最近一次提交),工作目录不会发生变化
git reset <commit> <file>
:重置暂存区的指定文件到指定的(可以是commit的hash也可以是HEAD及其祖先,HEAD~1
表示HEAD
的父亲,是HEAD的前一次提交,没有时默认是HEAD
)。
git reset [--hard|soft|mixed|merge|keep] [<commit>]
:将当前分支重设到指定的,并且根据mode有可能更新暂存区和工作目录。mode的取值可以是hard、soft、mixed、merged、keep。
hard
:重置暂存区与工作目录到指定提交,删除之后的所有提交并将HEAD指向该提交,此操作危险指数较大(应慎用)soft
:暂存区与工作目录不会变化,仅仅删除之后的所有提交并将HEAD指向该提交mixed
:默认的,重置暂存区到指定提交,删除之后的所有提交并将HEAD指向该提交
git checkout -- <file>
:撤销工作目录的修改。使用该命令撤销的修改不能恢复。
HEAD
是指向当前分支引用的指针,该指针指向在该分支上的最后一个提交的指针。这意味着HEAD将是下一个创建的提交的父亲。一般来说,把你的HEAD作为你最后一次提交的快照,是最简单的。HEAD~1
表示HEAD的前一次提交,HEAD~2
表示HEAD的前两次提交,以此类推
rm命令
git rm <file>
:删除工作目录的文件
git rm -f <file>
:强制删除工作目录的文件,不做更新检查
git rm --cached <file>
:删除暂存区的文件,停止追踪文件
mv命令
git mv <oldfile> <newfile>
:为文件重命名
git mv -f <oldfile> <newfile>
:强制为文件重命名,即使目标文件已存在
git mv <file> <dir>
:移动文件到指定目录
git mv -f <file> <dir>
:强制移动文件到指定目录名,即使目标文件已存在
分支与合并
branch命令
git branch
:查看所有分支
git branch <branchname>
:创建分支
git branch <branchname> <commit>
:以特定提交为基创建分支
git branch -d <branchname>
:删除分支(这是一个安全操作,Git会阻止删除包含未合并更改的分支)
git branch -D <branchname>
:强制删除分支
git branch -m <oldbranchname> <newbranchname>
:移动或者删除分支
git branch -M <oldbranchname> <newbranchname>
:强制移动或者删除分支
git branch -r
:列出所有被跟踪的远程分支
git branch -r -d <branchname>
:删除被跟踪的远程分支
git branch -a
:列出所有本地分支与被跟踪的远程分支
checkout命令
git checkout
:检查本地仓库分支与远程仓库分支的差异
git checkout <branchname>|<tagname>
:切换分支或切换到指定tag,同名时优先切换分支
git checkout -b <branchname>
:新建分支并切换到该分支上
git checkout -B <branchname>
:强制新建分支并切换到该分支上
merge命令
git merge <branchname>
:将指定分支合并到当前分支上(默认附带提交操作),在merge后面使用-m 表示提交消息
git merge <commit>
:将指定提交合并到当前分支上
git merge <oldbranch> <newbranch>
:将oldbranch分支合并到newbranch分支上
git merge --squash <branchname>
:将指定分支上所有修改放入当前分支工作目录与暂存区,不提交
git merge no--squash <branchname>
:将指定分支上所有修改放入当前分支工作目录与暂存区,并提交
mergetool命令
git mergetool
:在“merge”命令执行之后出现冲突时执行该命令,用来解决合并的冲突,冲突解决完了不要忘了提交
stash命令
git stash
:储藏工作目录与暂存区的状态到堆栈中
git stash pop [stash@{id}]
:恢复到指定储藏的状态(默认是最近一次储藏的状态),并从堆栈中移除该储藏
git stash apply [stash@{id}]
:恢复到指定储藏的状态(默认是最近一次储藏的状态)
git stash drop [stash@{id}]
:并从堆栈中移除指定储藏(默认是最近一次储藏)
git stash list
:显示所有储藏信息
tag命令
git tag
:列出所有标签
git tag -l 'v1.*'
:列出符合一定条件的标签
git tag <tagname>
:新建标签
分享与更新项目
fetch命令
git fetch
:下载远程仓库“origin”到本地
git fetch <remoterepository>
:下载指定远程仓库到本地
git fetch <remoterepository> <branchname>
:下载指定远程仓库指定分支到本地
pull命令
git pull <remoterepository> <remotebranchname>[:localbranch]
:拉取指定远程仓库指定分支到本地仓库指定分支(默认是当前分支)
push命令
git push <remoterepository> <localbranch>[:remotebranch] [--tags]
:推送本地仓库指定分支到远程仓库指定分支(默认是与本地分支同名的远程分支),默认是不推送标签到远程仓库的,加上–tags就会推送标签
remote命令
git remote
:查看所有与本地仓库关联的远程仓库
git remote -v
:查看所有与本地仓库关联的远程仓库,并显示url
git remote add <remote-name> <remote-url>
:添加与本地仓库关联的远程仓库
git remote rename <oldname> <newname>
:为远程仓库重命名
git remote remove <remote-name>
:移除远程仓库
submodule命令
git submodule add repository-url dir
:添加仓库到指定目录,使之成为本仓库的子模块
git submodule init
:初始化子模块
git submodule update
:更新子模块
子模块是本仓库依赖的另一个仓库,但是我们不会对所依赖的仓库(子模块)进行修改,只会在必要的时候进行更新操作。
考察与比较
show命令
git show [-times]
:显示最近times次(默认是一次)提交的所有对象信息
log命令
git log
:查看提交记录
git log --all
:查看所有提交记录
git log --oneline
:查看提交记录,以oneline形式显示,只显示一行,显示的内容时提交hash的前7位与提交消息
git log -p -times
:表示查看最近times次提交改变的内容
git log -stat [-times]
:查看最近times次(默认是所有)提交记录,并显示文件的差异分析
diff命令
如果想要查看具体某个文件的变化,只需要在命令最后添加-- 即可。在命令最后添加--
git diff
:查看工作目录与暂存区的差异。如果文件还未被跟踪,则无法查看。
git diff --staged [<commit>]
:查看暂存区与指定提交(默认是HEAD)的差异。在低版本的Git中,使用的是git diff --cached
命令。
git diff <commit>
:查看工作目录与指定提交的差异
git diff <commit> <commit>
:查看两次指定提交的差异
git diff branchname
:查看工作目录与指定分支的差异
git diff branchname branchname
:查看两个指定分支间的差异
shortlog命令
git shortlog
:显示总提交次数与每次提交的提交消息
describe命令
git describe [<commit>|<tag>]
:查看指定提交或者指定标签(默认是最近一次提交)的注解标签信息
git desribe --tags [<commit>|<tag>]
:查看指定提交或者指定标签(默认是最近一次提交)的标签信息
git desribe --all [<commit>|<tag>]
:查看指定提交或者指定标签(默认是最近一次提交)的引用信息
reflog命令
git reflog
:显示所有提交,下拉,推送,与切换分支操作
git reflog --all
:显示所有提交,下拉,推送操作
修补
apply命令
git apply [--index|--cached] patchname.patch
:在暂存区与工作目录或者暂存区(默认是工作目录)打补丁
git apply --reverse|-R patchname.patch
:反向打补丁
git apply --reject patchname.patch
:打补丁,将没有冲突的文件合并,将有冲突的文件标记出来,并生成对应的.rej文件
cherry-pick命令
git cherry-pick <commit>
:将另一个分支上面的指定提交应用到当前分支上
git cherry-pick banchname
:将指定分支上面的最后一次提交应用到当前分支上
rebase命令
git rebase branchname
:将指定分支上所有修改应用到当前分支上
git rebase branchname branchname
:将第一个指定分支上所有修改应用到第二个分支上
在rebase加上-i会提供交互式的变基操作
revert命令
git revert <commit>
:恢复一个指定提交
调试
bisect命令
使用二分查找,找到引入bug的提交
git bisect start
:开始二分查找
git bisect bad [<commit>]
:设置指定提交(默认是当前分支)为bad
git bisect good [<commit>]
:设置指定提交(默认是当前分支)为good
输入了上面三个命令后就会自动开始二分查找,我们之后只需要标记当前提交时bad还是good就行了,如果当前找的的提交时bad就输入git bisect bad,否则输入git bisect good直到找到有bug的提交。
blame命令
显示修改和作者最后修改的文件的每一行,这就是一个“问责”的命令,如果哪里有问题,我们可以很快地找到该问题是谁导致的。
git blame filename
:查看指定文件所有的操作者,看看是谁错误地修改了该文件
grep命令
git grep keys
:在工作目录中所有文件中搜索keys
git grep --cached keys
:在暂存区中所有文件中搜索keys