概念:
工作区(Working directory):将一个文件夹通过git init设置成一个git可以管理的文件夹(即:创建本地仓库)时,这个文件夹里的内容就是工作区。
版本库(repository):在工作区中,有一个.git文件夹,这个.git文件夹就是版本库。
暂存区(stage/index):.git文件夹下的index文件就是暂存区,用来暂时存放工作区中修改的内容。
.git目录中的文件:
index 暂存区
HEAD 指向当前分支的一个提交
refs/ 记录着每个分支指向的提交
info/ 指定本项目要忽略的文件
logs/ 记录着git的操作日志
objects/ git对象库,用来存储各种创建的对象以及内容。
命令:
1)设置git的用户名和邮箱:
命令:git config
1)设置 /etc/gitconfig文件,即操作系统上所有的用户都使用的配置文件:
git config --system user.name "jxn"
git config --system user.email "jxn@email.com"
2)设置 ~/.gitconfig文件,即当前登录用户使用的配置文件:
git config --global user.name "jxn"
git config --global user.email "jxn@email.com"
3)设置 repository/.git/config文件,即当前项目中使用的配置。注:必须先cd到一个git repository目录下,才能执行以下命令:
git config user.name "jxn"
git config user.email "jxn@email.com"
或
git config --local user.name "jxn"
git config --local user.email "jxn@email.com"
4)查看git用户名和邮箱:
git config user.name
git config user.email
说明:
1>如果是在某个git repository下使用该命令,则表示查看当前项目中使用的git用户, 查找顺序:.git/config --> ~/.gitconfig --> /etc/gitconfig
2>如果不是在某个git repository下使用该命令,则表示查看当前登录用户使用的git用, 查找顺序:~/.gitconfig --> /etc/gitconfig
说明:我们一般使用--global参数来设置git的用户名和邮箱。
2)生成秘钥:
ssh-keygen -t rsa -C "备注内容,一般会备注为邮件地址,方便区分,也可以不设置备注。"
3)clone分支:
使用http地址:
git clone http://***.git
# 参数:
# git clone http://***.git clone master分支
# git clone -b 2.0.4 http://***.git clone 指定分支
使用ssh地址:
git clone git@127.0.0.1:***/***.git
# 参数:
# git clone git@127.0.0.1:***/***.git 端口为默认的22端口
# git clone ssh://git@127.0.0.1:39876/***/***.git 端口为非标准的22端口
4)更新、提交、推送、回退:
git rm -r --cached .
# 删除暂存区中的变更:
# 场景:配置完.gitignore文件后没有生效,可以使用该命令来删除已经添加到暂存区的文件(本地文件不会删除)
git pull
# 更新本地代码(如果有冲突需要解决冲突)
# 说明:
# 1)如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建。
# 2)建立本地分支和远程分支的链接关系:git branch --set-upstream 本地分支名 远程仓库名/远程分支名
# 参数:
# git pull -p 若远程分支被删除了,则删除本地对应的分支
# git fetch -p 若远程分支被删除了,则删除本地对应的分支
# git fetch --prune origin 若远程分支被删除了,则删除本地对应的分支
git pull 远程仓库名 远程分支名
# 将远程指定分支的代码同步到当前分支。
# 举例:
# 在feature/develop-jxn分支下执行:git pull origin feature/develop 表示将远程feature/develop分支的代码同步到本地的feature/develop-jxn分支中。
# 在feature/develop-jxn分支下执行:git pull origin feature/develop-jxn 表示将远程feature/develop-jxn分支的代码同步到本地的feature/develop-jxn分支中,即同步当前分支的最新代码。
git add
# 参数:
# git add . 将新增、修改的文件添加到暂存区,不包括删除的文件。
# git add -u 将修改的文件添加到暂存区。
# git add -A 将所有改变的已跟踪文件和未跟踪文件添加到暂存区。
# git add -f 将未追踪的文件添加到暂存区。
# 说明:
# git add fileName 将指定的文件添加到暂存区。
git commit –m 本次提交的说明
# 将添加到暂存区的修改提交到本地仓库。
# 注意:idea等IDE工具在commit的时候,首先会将工作区的修改add到暂存区,然后再commit到本地仓库。
# 参数:
# git commit --amend # 将本次的修改添加到上次的提交中,同时修改上次提交的说明。
git push 远程仓库名(默认是origin) 本地分支名 远程分支名
# 将当前分支的修改推送到远程分支上
# 说明:
# 1)若远程分支名不存在,则会自动创建远程分支。
# 参数:
# git push origin master # 若远程分支名被省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名)。
# git push origin # 若当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略。
# git push # 若当前分支只有一个远程分支,则可以省略远程仓库名。
# git push -u origin master # 若当前分支与多个远程仓库存在追踪关系,则可以使用 -u 参数指定一个默认的远程仓库,这样后面就可以不加任何参数,直接使用git push来推送当前分支的修改了。
git fetch
# 更新远程代码到本地仓库,不会自动合并分支。
# 参数:
# git pull 等价于 git fetch + git merge FETCH_HEAD
# git pull --rebase 等价于 git fetch + git rebase FETCH_HEAD
# git fetch --all Fetch all remotes
# git fetch -p 若远程分支被删除了,则删除本地对应的分支
# git fetch --prune origin 若远程分支被删除了,则删除本地对应的分支
# 推荐使用:git fetch --all --prune
git rebase
# rebase当前分支:重新定义当前分支的起点,即变基。
# 说明:
# git rebase --help 查看文档。
# 重要:
# 若rebase不能达到效果,则建议使用merge来将最新的代码合并到当前分支:git merge --no-ff 分支名称
# 参数:
# git -p
# git --preserve-merges
#
# 推荐使用:git rebase -p origin/master
#
# 过程:
# 在master分支上新建一个topic分支,在topic分支上执行 git rebase 命令的过程:
# 1>先将在当前分支topic中提交的代码暂时转移到在一个临时文件中,
# 2>然后将master上最新的代码更新到当前分支,
# 3>最后再将临时文件中的内容添加到当前分支中。
# 冲突:
# 在第3步中,可能会有冲突发生,在解决完冲突后,提交并push即可。
# 1>在idea下,解决完所有冲突后,提交并push即可。
# 2>在命令行下,每解决一个冲突文件,就调用git add将该文件添加到暂存区,接着调用一次git rebase –-continue命令(该命令会提示开发者还有哪些冲突没有解决)。当所有的冲突都解决后,提交并push即可。
# 参数:
# git rebase --abort # 放弃当前分支的rebase操作
# git rebase --skip # 将引起冲突的commits丢弃掉,不建议使用!
#
# 举例:
# 我们从master分支上新建了一个topic分支来进行开发。
# 当我们在topic分支上开发的时候,其他人在master上又push了新的代码。
# 此时,我们可以使用:git rebase origin/master 或 git rebase master 或 git rebase 将master上新加进来的代码更新到topic分支中。
#
# 说明:
# 如果多人同时在一个topic分支上开发,则我们可以直接在idea中commit,然后push:如果远程有更新则会提示是否需要rebase,选rebase后:
# 1>若没有冲突,则idea会自动进行rebase操作并提交(注:这里的rebase操作只会将topic分支的最新代码更新下来,而不会将master分支的最新代码更新下来!);
# 2>若有冲突,则解决完冲突后提交push即可。
git cherry-pick
# 在本地合入其它分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,此时我们可以使用git cherry-pick来达到这样的效果。
# 举例:
# 更新远程分支
git fetch --all --prune
# 查看提交历史,找到需要合入的commitId
git log
# 将指定的commit合并到当前分支
git cherry-pick commitId
git log
# 查看所有人的提交日志
# 参数:
# git log --graph 查看分支合并图
# git log --graph --oneline --shortstat 查看分支合并图和简易统计信息
git reflog
# 查看自己执行过的所有命令
# 若不小心把代码revert了,则可以通过git reflog查看到之前到版本,然后通过git reset 版本号 来恢复。
git status
# 查看当前状态:
# 如果发现红色文件,则表示该文件未进入暂存区。
# 如果发现绿色文件,则表示该文件已经add到暂存区,但是还没有commit。
# 文件的三种状态:
# Untracked files: 工作区中未被跟踪的文件,一般是新建的文件。
# Changes not staged for commit: 修改后未add进暂存区的文件。
# Changes to be committed: 修改后并add进暂存区中的文件。
git diff
# 参数:
# git diff 比较 工作区和暂存区 之间的不同之处
# git diff --cached 比较 暂存区和版本库 之间的不同之处
# git diff HEAD 比较 工作区和版本库 之间的不同之处
git reset 版本号
# 回退到指定的版本(通过git log可以查到版本号:commmit后的那串数字) 注:HEAD指向当前的版本(最近一次的提交),HEAD^指向上一个版本,HEAD^^指向上两个版本。
# 注意:若不小心把代码revert了,则可以通过git reflog查看到之前到版本,然后通过git reset 版本号 来恢复。
# 参数:
# git reset --soft 版本号 只回退commit的信息,不回退index(暂存区)和本地代码。
# git reset --mixed 版本号 回退commit和index,不回退本地代码,默认使用该策略。
# git reset --hard 版本号 彻底回退到指定的版本,本地代码、commit、index都会回退。
# 说明:
# git reset 即 git reset HEAD
# git reset --hard origin/master 清空本地未push的代码
# 举例:
# 撤销提交的commit,将所有的提交合并为一个commit,重新提交:
# git fetch origin master
# git reset --soft origin/master
# git add .
# git commit -m "new commit message"
# git push origin HEAD:refs/for/master
git reset HEAD fileName
# 把暂存区中指定文件的修改回退到工作区中,即unstage。
# eg:把暂存区的修改回退到工作区:git reset HEAD .
git checkout -- fileName
# 用暂存区中的fileName文件来覆盖工作区中的fileName文件。
git revert 版本号
# 概念:
# 1)git revert是对工作区中的代码进行自动修改(回退),所以在git revert后,还需要执行一次commit才能实现回滚的效果。
# 2)对于已经push到服务器上的内容作回滚,推荐使用revert。
# 场景:
# 回退指定的版本:
# git revert 要回退的版本号
# 回退连续多个版本号:
# git revert 最老的版本号^..最新的版本号 # 虽然是一次操作,但是仍然会生成多个commit
# 回退merge提交:
# git revert 版本号 -m 1
# # merge提交会涉及到两个分支,因此revert的时候git不知道你是想以哪个分支为主线进行回退,故需要你指定主线分支。
# # 如果你在master上将分支A合并了,那么1就表示master分支为主线分支,2表示A分支为主线分支。
# # 若回退merge commit时没有-m参数,则报:commiterror: commit xxxxx is a merge but no -m option was given.
#
# 参数:
# -e git revert 版本号 -e # 回退版本号且编辑commit信息。
# -m git revert 版本号 -m 1 # 回退merge commit时,指定主线分支。
#
# revert和reset的对比:
# git revert是用一次新的commit来实现代码的修改(回退),git reset是直接删除指定的commit。
5)远程仓库的相关操作:
git remote
# 查看远程库列表
# 参数:
# git remote -v 查看远程库列表,并且显示clone的URL。
git remote add RepositoryName gitURL
# 添加远程仓库。
git remote show RepositoryName
# 查看远程仓库的信息。
git remote rm RepositoryName
# 删除远程仓库。
git remote rename oldName newName
# 给远程仓库重命名。
6)创建、删除、合并、推送分支:
git branch
# 查看当前分支
# 参数:
# git branch -r 查看远端所有分支
# git branch -a 查看所有分支
# 说明:
# * 表示当前所在分支
git branch 分支名称
# 创建分支
# 说明:在哪个分支上(或tag上)新建分支,就先切换到哪个分支上(或tag上),然后再使用'git branch 分支名称'命令来创建分支。
git branch -m oldName newName
# 重命名本地分支名称
git checkout 分支名称
# 切换到指定分支。 注:若本地没有该分支,但是远程仓库有该分支,则会将远程分支添加到本地仓库中。
git checkout -b 本地分支
# 创建并切换到新的分支
git checkout -b 本地分支 origin/远程分支
# 将远程分支同步到本地,即:创建本地分支并关联远程分支
git branch -d 分支名称
# 删除分支,这里删除的是本地的分支。
git merge 分支名称
# 合并指定分支到当前分支,fast forward模式
# 参数:
# git merge --no-ff 分支名称
# # --no-ff参数表示使用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并则看不出来曾经做过合并。--no-ff参数即:禁用Fast forward
git merge --abort
# 放弃合并操作,保留本地的修改。
git push 远程仓库名(默认是origin) 本地分支名:远程分支名
# 将本地分支push到远程分支
# 说明:
# 1)若远程分支名不存在,则会自动创建。
# 2)冒号的两边不能有空格,否则报错:dst ref refs/heads/2.0.6 receives from more than one src.
# 参数:
# git push origin 本地分支名 # 若省略远程分支名,则表示将本地分支push到远程的同名分支,即:git push origin A:A <==> git push orgin A 。
# git push origin :远程分支名 # 若省略本地分支名,则表示删除远程分支。
# git push origin --delete 远程分支名 # 删除远程仓库分支
# 推荐使用:git push origin HEAD:refs/for/master # 提交并发起code review
7)标签tag
git tag
# 查看标签
git show 标签名
# 查看标签的详细信息。
git tag 标签名 版本号
# 给指定的版本打tag,若不指定版本号,则默认打在最新的commit上。
# 说明:
# 标签是指向某个commit的指针
# 参数:
# git tag -a 标签名 -m "说明" 版本号
# # -a 指定tag名,-m 给该tag添加的说明
git tag -d 标签名
# 删除tag,这里删除的是本地的tag
git push 远程仓库名 标签名
# 将打的tag推送到远程。
# 参数:
# git push origin --tags # push所有tag到远程
# git push origin :refs/tags/标签名 # 删除远程指定的tag
# git push origin --delete tag 标签名 # 删除远程指定的tag
git checkout 标签名
# 切换到指定tag下,目的是为了:查看指定tag下的代码 或 在指定tag下新建分支
# 注意:我们一般不会在tag上做修改,若需要在指定tag下做修改时,我们一般会在该tag下新建分支,然后在分支上修改。
8)工作现场的存储
git stash
# 将当前分支的工作现场存储起来。
# 场景:当我们需要立刻切换到其它分支上,但是还不想提交自己正在编辑的代码时,我们可以使用git stash来将当前代码的变更暂时存储起来。
# 说明:
# 1)git stash后,当前分支和远程分支的内容完全一样(即:nothing to commit, working tree clean),此时,当前分支就可以切换到其它分支进行操作了。
# 2)在其它分支操作完成后,我们切换回当前分支,然后使用git stash pop来恢复之前存储的现场即可。
# 步骤:
# 1)保存当前分支的工作现场: git stash
# 2)查看工作现场是否保存成功:git stash list
# 3)切换到其它分支进行操作: git checkout otherBranch ...其它操作...
# 4)切换回当前分支: git checkout currentBranch
# 5)恢复当前分支的工作现场: git stash apply
# 6)删除已恢复的工作现场记录:git stash drop
# 注意:
# 1)可以直接使用 git stash pop 来完成第5步和第6步。
# 2)执行git stash list后,若发现有多个工作现场的存储记录,则在恢复工作现场时,使用git stash apply 存储记录的名称 来恢复当前分支的工作现场。eg:git stash apply stash@{0}
git常用命令
于 2018-02-17 08:21:06 首次发布
本文详细介绍Git的基本概念,如工作区、版本库、暂存区等,以及常用的Git命令,包括设置用户名和邮箱、生成SSH密钥、克隆分支、更新提交、推送回退等操作。此外还介绍了远程仓库的操作、分支的管理、标签的应用、工作现场的存储等高级功能。
摘要由CSDN通过智能技术生成