Git常用命令以及常见问题解决
Git常用命令以及场景问题解决
指令
新建代码库
# 在当前目录新建一个Git代码库
git init
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
配置
# 显示当前的Git配置
git config --list
# 设置提交代码时的用户信息
git config [--global] user.name "name"
git config [--global] user.email "email address"
添加文件
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
git add .
提交
# 提交暂存区到仓库区
git commit -m "msg"
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m "msg"
# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
# 提交时显示所有diff信息
git commit -v
分支
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
# 合并指定分支到当前分支
git merge [branch]
# 删除分支
git branch -d [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
标签
# 列出所有tag
git tag
# 新建一个tag在当前commit
git tag [tag]
# 新建一个tag在指定commit
git tag [tag] [commit]
# 删除本地tag
git tag -d [tag]
# 删除远程tag
git push origin :refs/tags/[tagName]
# 查看tag信息
git show [tag]
# 提交指定tag
git push [remote] [tag]
# 提交所有tag
git push [remote] --tags
# 新建一个分支,指向某个tag
git checkout -b [branch] [tag]
其他
# 普通克隆
git clone [url]
# 带分支克隆
git clone -b [url]
# 相当于进行了 git fetch 和 git merge两部操作
git pull origin master
# 强行推送当前分支到远程仓库,即使有冲突<慎用>
git push [remote] --force
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 显示所有远程仓库
git remote -v
常见错误
You have not concluded your merge (MERGE_HEAD exists)
可能是因为以前pull下来的代码自动合并失败导致的。
- 保留本地的更改
# 1. 中止合并
git merge --abort
# 2. 重新合并
git reset --merge
# 3. 重新拉取<如果有冲突,再解决冲突>
git pull
将多个提交合并为一个分支
git checkout test
# 将dev上的提交合并为一个提交,合并到master分支
git merge --squash dev
git commit -m "提交内容描述"
git push
cherry-pick
在团队开发的时候,我们的提交之间可能还会有穿插着其他同学的提交。当我们想要将自己的提交合并到某个分支,而又不想引入其他同学的提交。
git checkout test
## 选择指定的提交,摘取到当前分支,当然也可以在git 的sourceTree那个用选择多个提交(这里需要先选择你要摘取的分支)
git cherry-pick commit_id_1 commit_id_2
回撤未push的已提交代码
git reset [ --mixed | --soft | --hard] [<commit ID>]
- mixed
意思是:不删除工作空间改动代码,撤销commit,并且撤销git add .
操作
这个为默认参数,git reset --mixed HEAD^
和 git reset HEAD^
效果是一样的。
- soft
不删除工作空间改动代码,撤销commit,不撤销git add .
- hard
删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。
退回到指定commit版本
git reset HEAD commit_id编号
退回到上次提交
git reset HEAD^
退回到第2次提交之前
git reset HEAD~2
回退到远程最新
git reset --hard origin/分支名
已push回退
# 强制回撤和强制push,这样可能导致远程分支中同事的代码丢失。慎用
git reset --hard HEAD^
git push -f
git 放弃本地修改 强制更新
git fetch --all
git reset --hard origin/master
git reset 回滚一般使用默认的 mixed 或者粗暴的 hard 方式
h回撤已push的代码
cmd
# --hard 强制
git reset --soft 要回撤到的提交id
git push origin 分支名 --force
使用场景
当我们正在修改某个文件的时候,突然当前这个文件有另外一个bug需要马上修复并上线,而当前的修改的功能还没有完善不能直接提交,此时有两种办法可以解决
一、新建分支,将当前的修改功能转移到新的分支上,等待后续完善再合并回来
二、使用临时保存,git stash 将当前修改的功能临时存储在本地,等到后期恢复再继续完善
基本使用方法:
1、git stash save " stash remark " 存储的时候增加一个备注
2、当要恢复继续完善的时候 git stash pop / git stash apply 就可以恢复到当前的工作目录
其他命令:
(1)git stash save "save message": 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list: 查看stash了哪些存储
(3)git stash show: 显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{\(num},比如第二个 git stash show stash@{1}
(4)git stash show -p: 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{\)num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply: 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{\(num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop: 命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{\)num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{\(num}: 丢弃stash@{\)num}存储,从列表中删除这个存储
(8)git stash clear: 删除所有缓存的stash
.gitignore
# maven ignore
target/
*.jar
*.war
*.swp
*.zip
*.tar
*.tar.gz
# eclipse ignore
.settings/
*/.settings
/.settings/*
*/.externalToolBuilders
/.externalToolBuilders/*
.project
.classpath
*.project
*.settings
*.classpath
*target
# idea ignore
.idea/
*.ipr
*.iml
*.iws
.metadata/*
# temp ignore
*.log
*.cache
*.diff
*.patch
*.tmp
# system ignore
.DS_Store
Thumbs.db
*.class
*/target
*/target/*
*/bin
*/bin/*
*.prefs
/*.project
# npm ignore
*/node_modules
*/node_modules/*
*/dist