# git log

查看日志,常规操作,必备


# 日志
git log

# 概要日志
git log --oneline

# 带样式的日志
git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'

# git status

查看工作区状态


# 查看工作区
git status

# 概要查看工作区
git status --short

# git checkout

切换分支,放弃更改


# 切换分支
git checkout dev

# 新建并切换到分支
git checkout -b dev

# 新建一个分支 它拉取远程分支origin/devBranch
git checkout -b devBranch origin/devBranch

# 放弃工作区文件更改(撤销modified)
git checkout main.js

# 放弃工作区所有文件更改
git checkout .

# git commit

将暂存区的文件,提交到本地仓库


# 提交
git commit

# 概要提交
git commit -m

# 追加到上次提交记录中(此时可以编辑上次记录的描述)
git commit --amend

# 直接追加到上次提交记录中,不编辑
git commit --amend --no-edit

# git reset

reset本质上就是改变当前HEAD指针指向哪个commit


# 默认mixed reset,reset时,保留当前工作区的内容,并把add到暂存区的东西放回工作区
git reset --mixed(默认) HEAD或commitid

# 软reset,reset时,保留当前工作区的内容,暂存区的内容也没变
git reset --soft HEAD或commitid

# 硬reset,丢弃当前工作区和暂存区的内容(危险)
git reset --hard HEAD或commitid

##

# 撤销add,相当于mixed reset到HEAD
git reset HEAD [可以指定文件名]

# 撤销commit,相当于软reset到HEAD
git reset --soft HEAD

参考: hard soft mixed 的区别 (opens new window) hard reset 后怎么挽救 (opens new window)

# git revert

调整HEAD的指向,除了reset外,revert也能胜任。

  • reset 是使HEAD指针指向之前的commit,log中会丢失后面那些commit的记录,如若需要恢复则需要配合reflog去查找。

  • revert则是生成之前commit的一份拷贝,再commit一次,所以保留了log信息。(建议回退时使用这种操作,便于多人维护)


# 平稳回滚commit,完整保留log记录
git revert commit_sha1

# git rebase

rebase变基,跟merge的功能很像,但会修改commit记录。

除此之外,rebase还常用来压缩整理commit信息

# 在不同分支上执行rebase,跟merge相似可参考区别
git rebase 分支名

# 在同一分支上整理多个commit
git rebase -i 起始前一个commitId [结束commitId]

进入图形界面后
pick 要保留一个基础提交
s 挤压到前面的提交去(一般是pick)
r 可以重名名 
f 可以压缩commit记录到后一次commit中

wq保存后,会提示你修改最终合并commit的描述,修改后再commit就行

注意: git rebase会修改提交记录,应仅在自己的本地分支上执行rebase操作,否则会使多人维护变得混乱。

参考: 视频,rebase 与 merge 的区别 (opens new window) 视频,使用rebase整理commit (opens new window)

# git merge

合并分支


# 将目标分支合并到当前分支上
git merge 分支名

# git pull

pull相当于fetch + merge操作。

场景:远程仓库的commit平行或超前于本地仓库的commit时(说白了就是本地仓库在开发时不是最新的代码,没有进行一次pull操作,或线上仓库开发进度比你本地的快)。

操作:此时执行git pull会把远程仓库最新的代码fetch下来,并与当前的commit merge一次产生新的commit,这样会在log记录上产生了一个棱形(使用# 带样式的日志,可观察到)

后果:产生太多的棱形会使整体commit看起来很臃肿,不便于review;如果能保持一种线性的commit记录,那是最理性的。

解决方案:

  • --rebase操作(建议每次pull都使用rebase)

git pull --rebase

参考: 聊下git pull --rebase (opens new window)

# git push

push都是些与远程仓库进行交互的操作


# 将新的本地分支推送到远程仓库,
# -u是设置了分支跟踪, 
# origin 是 remote 名, dev 是远程仓库的分支名
git push --set-upstream origin dev

# 删除远程仓库的分支
git push origin -d dev

# git remote

这个东西用在你需要考虑维护多个地方仓库的时侯会考虑,或者修改仓库源的时侯。


# 建立与远程仓库的关系(通常要push到新的远程仓库时需要这个操作)
git remote add origin url

# 一个本地仓库可以与多个远程仓库建立关系
git remote add origin2 url...

# 修改目标远程仓库url
git remote set-url origin url

# git branch

操作分支


# 创建分支
git branch 分支名

# 删除分支
git branch -d 分支名 [-D强制删除]

# 重命名分支
git branch -m 旧名 新名

# 设置上游分支
git branch --set-upstream-to origin xxx 

# git stash

我喜欢称 stash 为剪切板,它在 stage的维度之外。stash不仅可以实现在不同分支分享工作区更改,也是减少add、commit的利器。


# 保存内容
git stash push [-m "描述"]

# 查看剪切板
git stash list

# 查看剪切板有什么更改(diff)
git stash show stash@{0} 

# 使用内容并删除记录
git stash pop [stash@{0}]

# 使用内容但不删除记录
git stash apply stash@{0}

# 删除某条记录(慎用)
git stash drop 

# 删除所有记录(慎用)
git stash clear

# git reflog

reflog中存储了仓库的所有操作记录,硬reset或rebase丢失的commit都能找回


git reflog


# github创建项目后


# 步骤1:与远程仓库建立关系
git remote add origin https://github.com/AlanNgaiJX/resp.git

# 步骤2:重命名分支名字(默认是master但是黑人运动提倡使用main)
git branch -M main

# 步骤3:将分支push出去,--set-upstream是main
git push -u origin main

# 查看所有分支,并拉取远程分支


# 查看所有分支
git branch -a

# 拉取远程分支(命名一个分支,将远程分支的内容拉取到该分支)
git checkout -b dev origin/dev

# 将当前修改的内容提交到新的分支


# 步骤1:在当前的master分支上的修改暂存起来
git stash

# 步骤2:暂存修改后,在本地新建分支(new_branch为新分支的名字)
git checkout -b new_branch

# 步骤3:将暂存的修改放到新建分支中
git stash pop

# 步骤4:进行commit
git commit

# 步骤5:将提交的内容push到远程服务器
git push

# 将某分支的内容更新到当前分支


# 步骤1:切回到master分支
git checkout master

# 步骤2:更新master分支
git pull

# 步骤3:切回dev分支
git checkout dev

# 步骤4:合并分支
git merge master