git是什么
- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
git常用命令
配置命令
查看配置
- 查看用户名:
git config user.name
- 查看邮箱:
git config user.email
基础配置
- 配置用户名:
git config --global user.name "yourusername"
- 配置邮箱:
git config --global user.email "youruseremail"
- 其他配置(让Git忽略Windows/Unix换行符转换):
git config --global core.autocrlf false
修改基础配置
- 命令行方式修改
- 修改用户名:
git config --global --replace-all user.name "your user name"
- 修改邮箱:
git config --global --replace-all user.email"your user email"
- 修改文件的方式修改
修改文件的方式,主要是修改位于主目录下.gitconfig 文件,可以直接使用记事本修改里边的name 或者email
- 在Linux和Mac中,可以通过vim命令进行直接编辑,比如vim ~/.gitconfig
- Windows系统同样位于用户主目录下,假设当前的用户是administrator,那么对应的配置文件的路径为:C:\Users\administrator.gitconfig
编码配置
- 避免git gui中的中文乱码:
git config --global gui.encoding utf-8
- 避免git status显示的中文文件名乱码:
git config --global core.quotepath off
git ssh key pair配置
- 作用:方便免密码拉取以及发布版本
- 步骤
sh-keygen -t rsa -C "youremaiaddress"
一路回车生成ssh key pairssh -add ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub
常用操作命令
仓库地址相关命令
- 查看远程仓库地址:
git remote -v
- 增加远程仓库:
git remote add github 远程仓库地址
github为远程仓库的名字,当本地仓库绑定了多个远程仓库时,在提交代码时注意以下命令的区别:
- 推送到origin(默认)仓库:
git push
- 修改默认的仓库:
git push -u 远程仓库名称
- 修改远程仓库地址:
git remote set-url origin 远程仓库地址
- 添加远程仓库地址:
git remote set-url --add origin 远程仓库地址
- 向多个地址推送代码:
git push
代码管理常用命令
- 克隆代码:
git clone 版本库地址 [本地文件夹名称]
- git初始化项目:
git init
- 查看文件状态:
git status
- 添加文件到暂存区:
git add file
- 提交到本地库:
git commit -am 说明
,a表示提交全部 - 拉取和提交文件:
git pull/push
- 显示暂存区和工作区的差异:
git diff
- 恢复文件到某个版本:
git reset --hard 版本号
- 查看某次提交记录提交的文件列表:
git log --name-status commitId
分支管理常用命令
- 列出所有本地分支:
git branch
- 列出所有远程分支:
git branch -r
- 列出所有本地和远程分支:
git branch -a
- 创建分支:
git branch 分支名称
- 切换分支:
git checkout 分支名称
- 创建并切换到分支:
git checkout -b 分支名
- 合并到当前分支:
git merge 需要合并的分支名
- 合并到当前分支:
git rebase 需要合并的分支名
- 合并部分提交内容到当前分支:
git cherry-pick commitID
- 删除本地方分支:
git branch -d 分支名称
- 强制删除本地分支:
git branch -D 分支名称
- 删除远程分支:
git push origin --delete 分支名称
暂存区管理常用命令
当当前分支有代码修改,但不能提交,此时需要切换到另外的分支,如果直接切换,会提示未提交不能切换,此时需要使用暂存区的相关命令进行处理
- 暂存当前工作区的改动到git栈:
git stash [save message]
save为可选项,message为本次保存的注释
- 查看暂存区git栈中的列表:
git stash list
- 弹出暂存区git栈中的改动:
git stash pop stash@{num}
- 使用该命令会删除栈中对应的stash;
- 直接使用
git stash pop
可以弹出最近一次的改动- stash@{num}中的num可以在使用
git stash list
命令后看到
- 弹出暂存区git栈中的改动:
git stash apply stash@{num}
- 删除暂存区git栈中的改动:
git stash drop stash@{num}
- 删除所有暂存区git栈中的改动:
git stash clear
其他高频操作和命令
忽略指定文件或目录
- 在.gitignore添加忽略文件
- 使用命令检查.gitignore文件是否配置有效,检查命令为:
git check-ignore -v 文件名
如果文件已经被忽略了,此时需要提交可使用强制提交的方式:
git add -f 文件名
按照最新的.gitignore配置忽略文件
- git rm -r --cached .
- git add .
- git commit -m ‘update .gitignore’
去掉已经托管的文件
- 有时候发现有不该提交的文件已经提交后,仅仅在.gitignore中加入忽略是不行的。这时候需要执行命令来去掉已经托管的文件,去掉文件后直接提交即可,相关命令如下:
- git rm -r --cached 文件/文件夹名字:取消对指定文件/文件夹的跟踪,但保留本地文件(较常用)
- git rm -r --f 文件/文件夹名字:取消对指定文件/文件夹的跟踪并删除本地文件
取消代码合并
- git merge --abort
代码覆盖
本地代码覆盖远程代码
git push -f
注意:该命令需要权限,权限默认为允许
远程代码覆盖本地代码
git fetch
git reset --hard origin/远程分支名称
解决冲突
git merge和git pull命令导致的冲突
- 手动处理完冲突后
git commit -a
git rebase命令导致的冲突
- 手动处理完冲突后使用
git rebase --continue
或者git rebase --skip
git stash apply命令导致的冲突
- 手动处理完冲突后使用
git add .
代码撤销
撤销工作区中文件的修改
git checkout -- <file>
- 文件自修改后还没有被放入到暂存区,撤销修改则会回到版本库中的状态
- 文件已经添加到暂存区后又做了修改,撤销修改则只会回到暂存区中的状态
撤销最近一次的提交
git reset HEAD^
在HEAD前支持以下参数
--soft
:不删除工作空间的改动代码 ,撤销commit,不撤销git add file--hard
:删除工作空间的改动代码,撤销commit且撤销add
回滚到指定的版本
- 方式一:
git reset commitID
注意:
- 使用此方式会将提交记录一并撤销,因此在使用
git push
命令时,会导致提交被拒绝,必须时启用强制提交的命令:git push -f
- 强制提交时,可能会遇到不允许强制提交的情况,因此推荐使用第二种方式来回滚代码
- 方式二:
git revert commitID
使用此方式代码版本记录不会被撤销,而是产生新的代码版本
- 使用以上两种方式回滚代码后,本地代码并不会改变,此时需要使用
git checkout 文件名
来修改本地的文件
单个文件回滚到指定版本
- 查看文件所有的修改记录:
git log fileName
- 回退到指定版本:
git reset 版本号 fileName
- 提交到本地:
git commit -m "提交的描述信息"
- 更新到工作目录:
git checkout fileName
- 提交到远程仓库
git push origin master
代码恢复
找回被删除的分支
找回分支的前提是没有执行git gc
命令清除分支
一般情况下,除非手动执行了
git gc
命令,否则gc对那些无用的object会保留很长时间后才清除的,reflog是Git提供的一个内部工具,用于记录对Git仓库进行的各种操作,可以使用git reflog show
所有的管理类操作日志git log与git reflog的区别:
git log
命令可以显示所有提交过的版本信息,但我们对分支的一些管理操作并不会显示出来;这些管理的操作日志并不是没有记录,而是需要使用git reflog
命令才能显示
找回步骤
- 找出commitID:
git reflog show
- 新建已删除的分支
git checkout -b 新建的分支名称 commitID
git checkout 分支名称 commitID
找回回滚前的代码
- 找出回滚前的commitID:
git reflog show
- 恢复:
git reset --hard commitID
从历史版本中找回删除的文件
- 找出要恢复的commitID:
git reflog show
- 恢复:
git checkou commitID 文件路径
修改commit描述
- git commit --amend
运行该命令会进入vim编辑器,修改注释后保存即可
转移commit进行提交
处理流程
- git checkout -b branchName [remotes/origin/branchName]:新建一个分支
- git cherry-pick commitId:挑选需要提交的commit
- git push origin branchName:提交到指定远程分支
内容扩展
- git cherry-pick <commitHash>:将指定提交转移到当前分支
- git cherry-pick branchName:将branchName分支的最近一次提交转移到当前分支
- git cherry-pick <HashA> <HashB>:将多个提交转移到当前分支
- git cherry-pick A…B:将A到B的所有提交转移到当前分支(不包含A)
- git cherry-pick A^…B:将A到B的所有提交转移到当前分支(包含A)
- cherry-pick配置项
- -e,–edit:打开外部编辑器,编辑提交信息
- -n,–no-commit:只更新工作区和暂存区,不产生新的提交
- -x:在提交信息的末尾追加一行(cherry picked from commit …),方便以后查到这个提交是如何产生的
- -s,–signoff:在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作
- -m parent-number,–mainline parent-number:如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动,-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号
- 常用命令:
git cherry-pick -m 1 <commitHash>
,表示Cherry pick采用提交commitHash来自编号1的父分支的变动,一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)
常见问题处理
执行ssh-add时出现Could not open a connection to your authentication agen
- 先执行
eval ssh-agent
- 执行
ssh-add ~/.ssh/rsa
- 再使用
ssh-add -l
查看就有新加的rsa了
推送本地克隆项目的更新内容
- 增加文件至本地仓库:
git add .
- 提交文件到本地仓库:
git commit -am 提交描述
- 推送:
git push
将本地已有文件夹和文件推送到远程服务器处理流程
- 初始化本地的项目文件:
git init
- 绑定远程仓库地址:
git remote add origin 远程仓库地址
- 增加文件至本地仓库:
git add .
- 提交文件到本地仓库:
git commit -am 提交描述
- 拉取远程代码:
git pull origin master
- 提交到分支(第一次提交):
git push --set-upstream origin 分支名称
将本地已有仓库推送到线上仓库(空白仓库)
- 绑定远程仓库地址:
git remote add origin 远程仓库地址
- 提交代码到远程仓库:
git push -u origin master
-u选项会指定一个默认主机
本地仓库与远程仓库建立关联
git remote add origin 地址
修改与本地仓库连接的远程仓库地址
git remote set-url origin 新远程仓库地址
git pull 失败
- 错误提示为:fatal: refusing to merge unrelated histories
- 处理方式:
git pull origin master --allow-unrelated-histories
idea terminal使用git log命令无法显示中文
- 修改终端设置
- 路径为:Settings -> Terminal -> Project settings
- 在Environment Variables中增加`LESSCHARSET=utf-8`