2019-10-28 Git-git的常用命令总结

232 阅读8分钟

Git的一些常用命令

1、Git的初始化

## git配置
git config --list // 查看全局配置
// 全局配置,只需一次
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
// 在当前项目中配置,提交会覆盖全局配置
git config user.name [用户名]
git config user.email [邮箱地址]
// 检查配置信息
git config --list
git config <key> // 检查git的某一项配置
git config --global alias.[别名] [git命令]  // 给git命令配置别名-去掉git字符加双引号
例如:git config --global alias.lol "log --oneline --decorate --graph --all" // 展示日志合并图

mkdir hello-git // 创建文件夹
cd hello-git
git init // 初始化Git相当将文件夹升级为仓库
ls
ls -ah // 查看目录下的隐藏文件
find . -name ".git" | xargs rm -Rf  // 解除git仓库 

// 一些额外的基础命令行操作
clear // 清除
echo [content] > [文件名.后缀] // 创建文件并写入内容
ls // 展示当前目录下的所有文件
rm [文件名] // 删除文件
rm -rf [目录名] // 删除目录
mv [源文件] [重命名文件] // 重命名
cat [文件名] // 查看文件内容
vim [文件名] // 编辑文件
            	- 按i进入编辑模式
            	- 按esc&:进入命令执行
            	- q!强制保存
            	- wq保存并退出

2、Git的本地操作

echo 'message' >> README.md  // 创建一个文件并写入数据
git status // 查看当前版本库的状态
git add README.md  // 添加文件到暂存空间
rm -f README.md // 删除文件
git checkout README.md // 恢复文件
cat README.md // 查看文件
git add . // 添加多个文件
git rm --cached README.md // 取消添加
# .gitignore // 忽略文件
git commit -m "message" // 提交代码  -am是add和commit合并操作
git stash // 暂存工作现场到栈
git stash pop // 从栈中弹出工作现场
git restore . // 放弃修改
git log // 查看记录
git log --oneline // 简短日志
git reflog // 查看操作记录,包括回退记录
git reset HEAD^ // 只是版本回退,不更新工作区
git reset --sort HEAD^ // 不删除工作空间的改动代码,撤销commit,不撤销git add
git reset --hard HEAD^ // 不但版本回退,也会更新工作区的文件回到上一个版本,同时删除工作空间的代码,撤销commit且撤销git add
git添加忽略目录:git rm -r --cached path/to/directory 然后在.gitignore文件里添加名字

3、Git分支开发

  • 工作区(Working Directory):文件目录因为你的开发工作就是对文件的修改所以叫工作区
  • 缓存区(Stage):没有提交前也就是没有完成工作结果代码保存的地方
  • 版本库(Repository):每一个工作结果的时间带会被按照不同的提交记录保存起来

Git原理

# 默认的分支master
git checkout -b dev // 创建dev分支并切换
git commit -am "message"  // add&&commit(对新增的文件的无效)
git checkout master // 切换主分支
git merge dev // 将开发分支dev合并到主分支(存在多余一条记录,常用于从dev合并到master分支上)
git rebase dev // 将开发分支变基到主分支上(不存在多余记录相当于合并,常用于从master上合并代码到dev)
git merge -d dev // 合并且删除分支
git merge --abort // 取消合并
git branch // 查看分支
git branch -a // 查看且包括远程分支
git branch -D <分支名称> // 删除分支
git branch -m oldbranch newbranch  // 修改分支名称 
git checkout --track [origin/develop] // 创建本地分支开发分支跟踪远程同名分支
git log --graph --pretty=oneline --abbrev-commit // 查看合并过程
git merge --squash dev // 使用squash方式提交,只合并不commit,需要主分支自己去commit
git tag v1.0 // 将最新的提交打上标签
git tag v1.0 <commit_id> // 给指定的commit打标签
git tag // 查看标签
git cherry-pick <commitHash> 将指定的commit应用于其他分支(--abort代表取消)
git branch -vv // 查看本地分支和远程分支的映射关系
git push -u origin [分支名(一般主分支为master)] // 将版本库的代码提交到远程库并建立关联 -u 是--set-upstream的缩写
git log --oneline // 查看提交的历史记录commit
git mv [oldName] [newName] // 文件重命名
git rm [文件名] // 删除文件-先删除文件,再提交到暂存区

3、Git远程库操作

## 获取SSH密钥,在Github官网上
ssh-keygen -t rsa -C "youremail@example.com"
## 添加远程分支
git remote add origin git@github.com:youraccountname
git remote -v // 查看远程关联库
git push // 推送
git fetch // 拉取
git fetch <拉取源> // 如果有多个远程源
git pull // 相当于fetch+merge
git push origin -d <branch-name>
git checkout -b 本地分支名 origin/远程分支名 // 将远程仓库的指定分支拉取到本地(本地不存在的分支并建立连接)
git push -f origin master // 强制推送
git push origin [new-branch] // 推送本地分支到远程,没有会新创建远程分支
git branch --set-upstream-to=[远程分支] [本地分支]  // 建立远程分支与本地分支的关联
git remote show origin // 查看remote地址、远程分支与本地分支对应的相关信息
git remote prune origin // 同步本地分支,比如远程分支不存在则删除本地分支

4、第一次关联远程库操作

git init
git add <file>
git commit -m "add"
git remote add origin git@github.com...
git push -u origin master
rm -rf .git // 取消git关联

5、撤销&重置

在工作区中的修改,还未添加到暂存区中,这时候想取消修改(在工作区)

git checkout [文件名] // 第一种方法-取消修改单个文件,在工作区中
git checkout . // 恢复所有文件
git restore [文件名] // 第二种方法,将修改文件恢复
git status // 查看当前的所有文件状态
git diff // 查看工作区中的修改

通过git add将修改添加到暂存区中,如果想要撤销修改也有以下几种方法(在缓存区)

git reset HEAD [fileName] // 第一种方法取消文件的修改,从暂存区恢复工作区
git restore --staged [fileName] // 第二种方法撤销修改

如果git commit已经将修改提交到版本库中了,这时候想要再撤销提交则要用到git reset命令了,这个命令非常强大(在版本库)

git log --oneline // 查看分支上提交记录commitHash
git reflog -n 3 // 只要是HEAD有变化,都会记录下来,这里是查看最近三次的操作
git show [commitHash] // 查看某一次的commit提交的详细信息

// reset三部曲
第一部:
git reset --soft HEAD~ // 用上一次的提交内容覆盖HEAD内容,从版本库中退回到暂存区中
git reset --soft [commitHash] // 用commitHash内容覆盖HEAD内容

第二部:
git reset [--mixed] HEAD~ // 用上一次的提交内容覆盖HEAD内容,也覆盖掉暂存区内容,直接从版本库回到了工作区
git reset [--mixed] [commitHash] // --mixed代表可省略,用commitHash的内容覆盖HEAD和暂存区内容

第三部:
git reset --hard HEAD~ // 回到上一个提交内容,完全把数据抹掉,危险
git reset --hard [commitHash] // 用commitHash内容重置HEAD,重置暂存区,重置工作区
注:这时候版本回退,我们本地的HEAD如果落后于远程对应分支commit记录,则应该用
git push --force // 强制推送覆盖掉远程分支的commit即可

.gitignore忽略文件

一般将一些安装依赖目录node_modules、打包文件目录dist等不需要提交到git服务器上,这就需要增加.gitignore文件了,列出一些不需要提交的文件以及目录

# 此为注释,将被git忽略
# 打包目录
/dist 

# 依赖目录
/node_modules

yarn.lock
# 等等...

git rebase和git merge的区别与实用场景,还有git cherry-pick操作

git rebase合并操作

git1.webp

  • master代表主分支
  • experiment代表开发分支

当使用git rebase操作时,不会产生多余的commit记录,会把当前分支的commit删除,并拼接在要合并的分支上更新的commit后面组成新的一串commit记录,只是commit_id变了,内容没有变化,如下图

git3.webp

git4.webp

一般来说,把主分支上的代码合并到自己分支上先使用git pull --rebase(拉取远程分支合并到本地分支),然后git rebase(合并主分支到本地自己分支)

通俗解释:rebase变基,可以直接理解为改变基底。experiment分支是基于master分支的C2拉出来的分支,experiment的基底是C2,而master在C2之后有新的提交,就相当于此时要用master分支的最新提交C3来作为experiment分支新基底。实际操作是把C2之后的experiment的提交先暂存下来,然后删除原来这些提交,在找到master的最新提交C3,把暂存下来的提交在接上去(接上去就是逐个和新基底C3处理冲突的过程),如此experiment分支的基底就相当于变成C3,而不是原来的C2了。(注意:如果master分支在C2之后没有新的提交,那么还是用原来的C2作为基,rebase相当于无效,等同于merge,差异只在于git merge会多一条记录merge操作的提交记录)

git merge合并操作

git2.webp

此操作相当于把自己分支和主分支的提交记录做下汇总,形成一个新的commit再提交,多了一条commit记录

一般来说,把自己分支合合并到主分支上时需要进行此操作,为了历史记录不被删除,方面后续查找

git cherry-pick单独合并一条记录

使用git cherry-pick 会把这一条commit修改的内容合并到当前分支上,一般用于小修改