2**
**
在学习git前首先需要对相关名词和概念有基本了解,git基础知识学习可参考以下资料:
# 配置用户名
git config --global user.name "用户名"
# 配置用户邮箱
git config --global user.email 用户邮箱
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global --list
# -t rsa 加密方法
ssh-keygen -t rsa -C "email邮箱"
# 初始化目录
git init
# 查看所有文件状态
git status
# 查看指定文件状态
git status filename
ex:git status readme.txt
# 将所有修改的代码添加到暂存区
git add .
# 将指定代码文件添加到暂存区
git add [filename]
ex: git add readme.md
# 强制添加文件到暂存区(一般是.gitignore忽略的文件)
git add -f <filename>
# 将暂存区代码提交至本地仓库并注提交说明
git commit -m "note"
ex: git commit -m "first commit"
# 取消暂存区单个文件
git reset HEAD
# 取消暂存取所有文件
git reset HEAD -- .
# 将本地仓库代码推送到远程仓库的不同分支
git push [remote] [remote-branch]
# 将本地仓库master分支推到origin远端仓库(远端仓库就有了matser分支)
git push origin master
# 由于远端仓库是空的,所以首次推送到远端要加-u
git push -u origin master
# 将本地仓库代码推送到名为origin远程仓库的dev分支
ex: git push origin dev
# 将本地的dev分支推送到远程仓库的dev-1分支
git push origin dev:dev-1
# 将远程仓库指定分支代码拉到本地工作区
git pull [remote] [remote-branch]
# 从origin远程仓库拉取master分支代码
ex: git pull origin master
# 查看提交历史
git lg
# 查看提交历史记录详细信息
git log
# 查看每次提交的备注说明和版本号
git log --pretty=oneline
每次提交版本号都是唯一,HEAD表示当前版本,当我们需要回退到某个版本的代码时就必须要知道版本号才能回退
# 查看命令历史
git reflog
当前版本为HEAD
,上版本为HEAD^
,上上个版本为HEAD^^
,上100个版本HEAD~100
# 回退到上一版本
git reset --hard HEAD^
# 回退到上上一个版本
git reset --hard HEAD^^
# 回退到指定版本
git reset --hard 版本号
ex: git reset --hard 1094a
# 查看工作区与版本库最新版本区别
git diff HEAD -- 文件名
ex: git diff HEAD -- readme.txt
修改的文件放到了缓存区和本地仓库,但是想撤销修改
# 撤销文件修改
git checkout -- 文件名
ex: git checkout -- readme.txt
撤销修改后的文件有两种情况:
(1)文件修改后还未放到缓存区,撤销修改后将回到与版本库一模一样的状态,也就是回退到上一次执行git commit
命令后的文件
(2)文件修改后将文件已经git add
到了缓存区,然后文件又做了修改,此时撤销修改文件将变成添加到暂存区后的状态,也就是回退到上一次执行git add
命令后的文件
# 删除工作区文件
rm 文件名
ex:rm test.txt
# 删除提交到版本库(本地仓库)的文件
git rm 文件名
ex: git rm test.txt
如果删错了文件,可以使用撤销修改将误删的文件恢复,但只能将文件恢复到最新版
查看远程仓库
# 查看远程仓库
git remote -v
# 查看远程仓库详细信息
git remote -v <remote-name>
ex: git remote -v origin
远程仓库名通常用 origin 命名,URL就是在github/gitee克隆代码的地址
# 关联远程仓库
git remote add 远程仓库名 URL
ex:git remote add origin [email protected]:michaelliao/learngit.git
删除远程仓库即解除本地与远程仓库的链接关系,远程仓库仍然存在,若想删除远程仓库则需要登录github/gitee
# 删除远程仓库
git remote rm 远程仓库名字
ex: git remote rm origin
# 重命名远程仓库
git remote rename <old-remote-name> <new-remote-name>
ps:注意要和前面的撤销修改文件命令区分开来
# 创建分支
git checkout 分支名
ex: git checkout dev
# 创建并切换到该分支
git checkout -b 分支名
git switch -c 分支名
ex: git checkout -b dev
# 切换到已有分支
git switch 分支名
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看本地和远程分支
git branch -a
# 删除本地分支
git branch -d 分支名 # -d会在删除前检查merge状态(其与上游分支或者与head)
git branch -D 分支名 # -D是git branch --delete --force的简写,它会直接删除,主要用于强制删除一个没有被合并的分支
ex:git branch -D dev
# 删除远程分支
git push <remote-name> --delete 分支名
ex:git push origin --delete dev
Fast forward
模式(快速合并模式)
通常,合并分支时,如果用Fast forward
模式进行分支合并,在这种模式下,删除分支后,会丢掉分支信息。
# 合并分支到当前分支上
git merge 分支名
# 当前位于master分支,将dev分支内容合并到master分支
ex: git merge dev
强制禁用快速合并模式
如果要强制禁用Fast forward
模式,Git就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "提交说明" 合并的分支名
# 强制禁用快速合并模式
# 将dev分支内容合并到当前master分支上,并提交commit说明
ex: git merge --no-ff -m "merge with no-ff" dev
当在当前分支(dev)完成一半工作需要切到其他分支工作时,当前分支部分文件没有修改完,此时使用git status
查看当前分支会发现有未被跟踪和修改的文件,此时输入git stash
命令可以将当前分支临时封存起来,然后git status
查看当前分支状态是干净的,可以发现之前未被跟踪和修改的文件被临时封存起来了,这时候切到其他分支工作不影响当前分支工作。
当切回该分支继续工作时,可以查看临时封存的版本号,并可以切换临时封存前的状态,但需要删除封存的stash内容
# 临时封存分支
git stash
# 查看封存文件记录,可以看到临时封存的版本号
git stash list
# 恢复到临时封存之前的状态
git stash apply
# 删除临时封存的stash内容
git stash drop
# 恢复并删除临时封存内容
git stash pop
当前位于dev
分支,master
分支有个bug
修改了,同样需要将dev
分支上该处的bug进行修改,有两种方法:
master
分支merge
到当前dev分支上。这样会存在一个问题,就是别人也在master
分支合并了很多内容,当前dev
分支相较于master
分支落后了很多,而我只想修改当前dev
分支存在那个bug的位置,这样就需要用到第二种方法;bug
单独切了一个分支issue
(从master
分支切出来),提交commit
后版本号为4c805e2
,然后将issue
分支合并到master
分支上;此时切回之前工作的dev
分支,输入cherry-pick
命令就能将issue
分支内容合并到dev
分支上git cherry-pick 版本号
ex: git cherry-pick 4c805e2
当本地的dev
分支需要拉远程仓库dev
的代码时,使用git pull
拉取代码失败报一下错误,需要将本地dev
分支与远程仓库dev
分支先建立链接,然后在git pull
拉代码
# 将本地分支与远程仓库对应分支建立链接
git branch --set-upstream-to <branch-name> origin/<branch-name>
git branch --set-upsteam-to=远程仓库名/远程仓库对应分支 本地分支
ex:git branch --set-upstream-to=origin/dev dev
# 打标签
# 默认标签是打在最新提交的`commit`上的
git tag <tag name>
ex: git tag v1.0
# 对指定版本打标签
git tag <tag name> <commit>
ex: git tag v1.0 f52c
# 带有说明的标签
git tag -a <tag name> -m "标签说明" <commit>
ex: git tag -a v0.1 -m "version 0.1 released" 1094adb
标签不是按时间顺序列出,而是按字母排序的
# 查看标签
git tag
# 查看标签具体信息
git show <tag name>
ex: git show v1.0
# 删除标签
git tag -d <tag name>
ex: git tag -d v0.1
# 将标签推送到远程
git push <remote> <tag name>
ex: git push origin v1.0
# 将本地所有标签推送到远程
git push <remote> --tags
ex: git push origin --tags
# 删除本地标签
git tag -d <tag name>
ex: git tag -d v1.0
# 删除远程标签
git push <remote> :ref/tags/<tag name>
ex: git push origin :refs/tags/v0.9
改变版本号、提交说明、分支的颜色
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"