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 reset --hard commit_id
# 强制更新到远程
git push origin branch --force

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

posted @ 2020-10-23 14:06  itwetouch  阅读(177)  评论(0编辑  收藏  举报