3

作者:LogM

本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~

1. 克隆

git clone <版本库的网址>
git clone <版本库的网址> <本地目录名>
git clone --recursive <版本库的网址> <本地目录名>

# 指定要克隆的分支
git clone -b <分支名> <版本库的网址> 
git clone -b <分支名> <版本库的网址> <本地目录名>

# 克隆版本库的时候,所使用的远程主机自动被git命名为origin
# 使用-o修改远程主机名
git clone -o <远程主机名> <版本库的网址>

2. 查看历史

# 查看历史的每一次操作
git reflog

# 查看历史commit 
git log
git log --oneline

# 查看commit的修改
git show <commit_id>
git show --stat <commit_id>
git show <commit_id> <filename>

# 查看两个分支的差异
git diff <branch1> <branch2>
git diff --stat <branch1> <branch2>

# 查看某个文件的改动,还未add
git diff <filename>

# 查看已经add的文件相比上一次commit有哪些改动
git diff --cached

3. 远程主机管理

# 列出所有的远程主机名
git remote

# 参看远程主机的网址
git remote -v

# 查看主机的详细配置
git remote show <主机名>

# 添加远程主机
git remote add <主机名> <网址>

# 删除远程主机
git remote rm <主机名>

# 远程主机改名
git remote rename <原主机名> <新主机名>

4. 分支管理

# 将远程主机新的更新取回本地,默认取回所有branch的更新
# 它取回的代码对你本地的开发代码没有影响(只是让 `git branch -a` 显示出远程新增的branch,不修改本地代码)
git fetch <远程主机名>

# 取回远程主机的特定branch
git fetch <远程主机名> <分支名>

# 查看远程分支
git branch -r

# 查看所有分支
git branch -a

# 在origin/master的基础上,新建本地分支
git checkout -b newBrach origin/master
# 相当于执行
git branch newBrach
git checkout newBrach

# 查看跟踪关系
git branch -vv

# 手动建立追踪关系
git branch --set-upstream-to=origin/remoteBranch localBranch
# 当远程分支不存在时,创建远程分支并建立跟踪关系
git push -u origin localBranch 

# 删除本地分支
git branch -d <BranchName>

# 本地分支改名
git branch -m <oldName> <newName>
# 如果对应的远程分支也要改名,则先删除对应的远程分支,再把本地分支push到远程

# 推送时如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
git push origin :master
# 等同于
git push origin --delete master

5. 拉回更新

# 取回远程主机某个分支的更新,再与本地的指定分支合并
# 实质上,这等同于先做git fetch,再做git merge
git pull <远程主机名> <远程分支名>:<本地分支名>

# 采用rebase模式,可以使用--rebase选项
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略
git pull <远程主机名> <远程分支名>

# 如果本地的当前分支在远程主机上已经有追踪关系的分支,可以省略分支名
git pull <远程主机名>

# 如果只有一个追踪的分支,则可以省略主机名
git pull

# 如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支
# 加上参数 -p 就会在本地删除远程已经删除的分支
git pull -p
# 等同于
git fetch --prune origin 
git fetch -p

6. 推送更新

# 将本地分支的更新,推送到远程主机
git push <远程主机名> <本地分支名>:<远程分支名>

# 如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支,如果该远程分支不存在,则会被新建
git push origin master

# 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
git push origin :master
# 等同于
git push origin --delete master

# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
git push origin

# 如果当前分支只有一个追踪分支,那么主机名都可以省略
git push

# 还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项
git push --all origin

# 如果远程主机的版本比本地版本更新,推送时Git会报错,应当先pull合并代码。如果你一定要推送,可以使用--force选项
git push --force origin 

# git push不会推送标签(tag),除非使用--tags选项
git push origin --tags

7. 代码回滚

# 文件被修改了,但未执行git add操作
git checkout fileName

# 同时对多个文件执行了git add操作,但本次只想提交其中一部分文件
# 取消暂存
git reset HEAD <filename>

# 文件执行了git add操作,但想撤销对其的修改
# 取消暂存
git reset HEAD fileName
# 撤销修改
git checkout fileName

# 修改的文件已被git commit,但想再次修改不再产生新的Commit
# 修改最后一次提交 
$ git add fileName
$ git commit --amend -m"说明"

# 已在本地进行了多次git commit操作,现在想撤销到其中某次Commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
# hard:重设index和working directory,从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>
# soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。自从<commit>以来的所有改变都会显示在git status的“Changes to be committed”中
# mixed:仅重设index,但是不重设working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成“Changes to be committed”,但是会打出什么还未被更新的报告

# 将本地的状态回退到和远程一样
git reset --hard origin/devlop

# revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
# reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

8.用户配置

# 共三种层次的配置 
# --local / --global / --system
# 查看当前仓库的配置信息,打印信息的上部分为全局配置,下部分为当前仓库复写的配置
git config --list  
git config --global -l
# 修改配置,输入时可以不带引号
git config user.name "这里写用户名"  # 配置修改仅在当前仓库生效
git config --global user.name "这里写用户名"  # 配置修改在全局生效
# 或者直接编辑配置文件
git config -e
git config --global -e

9.标签tag管理

# 列出所有tag
git tag

# 创建新tag
git tag <tagName>
# 创建新tag并带注释
git tag -a <tagName> -m "my tag"

# tag推送到远程
git push origin <tagName>

# 本地删除tag
git tag -d <tagName>

# 远程删除tag
git push origin :refs/tags/<tagName>

10.其它

# 当远程分支领先于本地分支,而本地分支又有新修改时(新修改尚未add),按以下顺序执行解决可能的冲突
# 如果本地分支的修改已经add,需要先撤销add
git stash save  # 暂存修改
git pull        # 拉回远程的更新
git stash pop   # 恢复修改,如果有冲突会提示手动解决冲突

# 取消对某个文件的跟踪,但不在磁盘上删除该文件
git rm --cached xxx.txt

# git rebase 代替 merge 使 commit log 更简洁
https://juejin.im/post/5d2d24245188250501477cc4

# --no-ff 表示禁止Git执行"快进式合并"(fast-farward merge),目的是使得版本演进的时间线更清晰
git merge --no-ff develop

LogM
85 声望18 粉丝