git 常用命令

186 阅读6分钟

git clone

拉取远程项目到你本地

git clone '你的项目地址'

git add

添加代码到本地缓存

缓存全部

通过 . 占位符,代表提交任意文件,适合不必细分的时候

git add .

指定添加缓存

可以指定目录、指定文件提交,适合小范围或固定文件

git add /对应目录路径/
git add /对应文件路径/

git commit

给缓存的代码打上描述。这是必须做的,每次 git add 后,必须 git commit '你的描述',否则无法推送代码

git commit "console-log"

git push

将本地缓存代码推送到远程分支

git push // 默认推送到当前分支关联的远程分支
git push origin xx // 通过origin指定推送到某个远程分支

git fetch

从远程获取最新版本到本地,不会自动合并分支

git fetch 分支名

git pull

拉取远程分支代码,并且自动 merge 到当前分支,风险较大,需要注意解决冲突
git pull的默认行为是git fetch + git merge
git pull --rebase则是git fetch + git rebase.

git pull // 默认拉取当前分支关联的远程分支
git pull origin xx // 通过origin指定拉取某个远程分支代码到本地分支

git log

查看项目历史的提交信息

image.png

git status

git status命令用于显示工作目录和暂存区的状态。使用此命令能看到哪些修改被暂存了, 哪些没有, 哪些文件没有被Git tracked。git status不显示已经commit到项目历史中去的信息。

一般可以用来排查代码冲突,未提交的文件等

image.png

git stash

适用场景:

  • A分支没有完成的代码,但是要去修改B分支的代码
  • 想保留代码,但是又不想推送到远程分支

将代码缓存到本地,类似 git commit 但又有区分;通过git commit提交代码,在本地栈会又提交记录,这样导致log上会有大量不必要的记录。

git stash 不会产生提交记录,通过 git stash缓存

image.png

git stash list 可以查看 git stash 缓存列表

image.png 可以看到有3条缓存记录,因为修改了3个页面

image.png

git stash apply恢复缓存记录

image.png

实际应用中推荐给每个stash加一个message,用于记录版本,即git stash save取代git stash。如:

git stash save "添加console.log"

image.png

image.png

将缓存的记录重新释放有两个方式,git stash applygit stash pop 都可以将当前分支的最后一次缓存的内容释放出来。

git stash applygit stash pop 的异同

  • 相同:都会把最后一次缓存的内容释放出来
  • 差异:通过 pop 释放,会把对应的储存记录从list中删除,而apply不会

释放指定内容,使用git stash apply stash@{x}git stash pop stash@{x},可以将编号x的缓存释放出来

git stash apply stash@{x}
git stash pop stash@{x}

使用 git stash clear清除记录列表 ,注意会把修改的文件记录一并清除,请注意代码将代码提交后再清除

git stash clear

当然也可以使用git stash drop移除指定的stash栈

git stash drop stash@{x}

查看指定stash的提diff

git stash show

gie rebase 与 git merge

git rebase

将指定分支合并到 master

git rebase 分支名

如果有合并冲突,使用以下三种方式处理这些冲突:

git rebase --abort 会放弃合并,回到rebase操作之前的状态,之前的提交的不会丢弃;

git rebase --skip 则会将引起冲突的commits丢弃掉(慎用!!);

git rebase --continue 合并冲突,结合"git add 文件"命令一起用与修复冲突,提示开发者,一步一步地有没有解决冲突。(fix conflicts and then run “git rebase --continue”)

git merge

合并两个分支,将指定分支上所有内容合并到当前分支

git merge 分支名

两者区分

  • git merge 会将分支的提交按照提交时间进行排序,并且会把最新的分支commit合并成一个commit。最后的分支树呈现非线性的结构。每次都有提交记录;
  • git reabse 将dev的当前提交复制到master的最新提交之后,会形成一个线性的分支树。不会有提交记录;

使用场景

git reabse 适合个人分支开发,分支树单一简洁。缺点:不容易追溯问题,结构单一。
git merge 适合公共分支开发,在排查问题或者追溯需求时,会很方便。结构清晰,提交记录清晰

如果是公司项目,一整个团队开发,需要把代码合并到主分支时,要用 merge,不要用 reabse!!!
⚠️不要在公共分支使用rebase命令,会污染公共分支,这样公共分支就会存在你的commit记录,别人拉取的时候会存在你的最新的commit记录。

本地分支

查看本地分支

包括本地分支、远程分支

git branch

新建本地分支

新建分支

git branch 分支名

新建并切换

git checkout -b 分支名

拉取远程分支,并在本地新建一个分支

git checkout -b 本地分支 origin/远程分支

本地分支和远程分支建立映射关系的作用

git branch --set-upstream-to origin/远程分支名 本地分支名

查看分支关联关系

通过 git branch -vv 可以查看本地分支与远程分支的关联关系

git branch -vv

更新本地远程分支

新建分支时,想基于远程仓库的某个分支去建,但是本地没有这个分支记录,可以通过 git fetch origin去更新本地的分支列表

git fetch origin
// 或
git remote update --p

代码回滚

git reset

软回滚

软回滚的作用,是将最近的 commit 记录回顾,并且保留代码变更内容;适合误提交的场景!

git reset --soft HEAD^

强制回滚

撤销最近的提交,并撤销所有更改(包括工作区)

--hard 选项会丢弃所有未提交的更改,所以使用 --hard需要注意,是否不需要保留变更记录

git reset --hard HEAD^

git revert

撤销某个或多个 commit 提交,并生成一条记录

主要应用场景,撤销commit tree的某个节点,不影响到在这之后提交的 commit

git revert <commit-hash>

使用 git revert 会生成一条记录,所以需要编辑提交信息,编辑完后需要 :wq 退出保存

git reflog

reflog 记录了所有 commit 操作记录,包括 reset --hard后的记录,它可以用来找回丢失的commit记录

git reflog

image.png

commit 复制

cherry-pick

将已经提交的 commit ,复制出新的 commit应用到分支;适用于,部分代码抽离的场景。

例如你当前开发的分支混了两个版本的代码,当前版本只需要上部分代码,就可以使用 git cherry-pick 来抽离需要上线的 commit

git cherry-pick <commit-hash>

多个 commit 复制

git cherry-pick commit1 commit2

cherry-pick 代码冲突

使用 cherry-pick 复制时,若遇到代码冲突,git 会停止复制行为,并且抛出警告,若用户想要继续进行下去,需要告诉 git 继续操作

git cherry-pick --continue

继续复制 commit 操作,尽管会有代码冲突

git cherry-pick --continue
git cherry-pick --abort

放弃复制 commit 操作,回到操作前的样子,即放弃本次 cherry-pick复制

git cherry-pick --abort
git cherry-pick --quit

退出复制 commit 操作,但是会保留已复制成功的 commit

git cherry-pick --quit