Git 学习笔记

2022-04-22  本文已影响0人  _于曼丽_

配置

可以在全局范围做配置,也可以在项目范围做配置。全局范围的配置,会在当前登录用户的所有 Git 项目里面生效。项目范围的配置,只会在当前 Git 项目里面生效。

配置文件所在位置:

查看编辑配置文件

git config -l [--global | --local]
git config -e [--global | --local]

配置用户信息

git config [--global] user.name  "jack"
git config [--global] user.email "jack@githumb.com"

配置别名

git config [--global] alias.st status
git config [--global] alias.ci commit
git config [--global] alias.co checkout
git config [--global] alias.br branch
git config [--global] alias.lg log --oneline --decorate --all

忽略特殊文件

### 全局范围
vi ~/.gitignore
# 编辑配置文件
.DS_Store
# 指定全局配置文件
git config --global core.excludesfile ~/.gitignore

### 项目范围
cd 项目根目录
vi .gitignore
# 编辑配置文件
# 参考:https://github.com/github/gitignore
# 可以在项目的任意子目录中添加 .gitignore 文件,文件内的规则对 .gitignore 文件所在目录以及该目录的所有后代目录有效

基本操作

初始化

git init
ls -la
.git 目录下是版本库

添加文件

git add .
git commit -m '提交信息'

修改文件

git add .
git commit -m '提交信息'

删除文件

git rm file
git commit -m '提交信息'

重命名文件

git mv file newfile
git commit -m '提交信息'

移动文件

git mv file directory/file
git commit -m '提交信息'

提交操作

git commit -m '提交信息'   # 将暂存区内容提交到本地仓库
git commit -am '提交信息'  # 将工作区内容添加到暂存区,然后再将暂存区内容提交到本地仓库
git commit --amend -m '提交信息' # 使用一次新的 commit ,替代上一次 commit

查看操作

git status
git log
git log -10 --oneline --decorate --all --graph
git log | grep '关键字'
git reflog
git show commit-id

差异、撤销、回退操作

差异

# 比较工作区和暂存区
git diff [file]

# 比较暂存区和上次提交
git diff --cached [file]

# 比较工作区和上次提交
git diff HEAD [file]

# 比较工作区和某次提交
git diff commit-id | HEAD | master | v0.1 [file]
# 说明:HEAD branch tag 都是指针,指向某个 commit-id

# 统计一下有哪些文件被改动,有多少行被改动
git diff --stat

# 比较两次提交之间的差异
git diff old-commit..new-commit
git diff master../origin/master
git diff HEAD^..HEAD

版本回退

# 工作区 暂存区 版本库 都恢复到 commit-id
git reset --hard commit-id [file]

# 暂存区 版本库 恢复到 commit-id,工作区内容不变。如果不加参数,默认为 --mixed 
git reset --mixed commit-id [file]
git reset commit-id [file]

# 版本库恢复到 commit-id,工作区 暂存区内容不变
git reset --soft commit-id [file]

撤销

# 用暂存区的内容替换工作区的内容
git checkout file
git checkout .

# 用上次提交的内容替换工作区和暂存区的内容
git reset --hard HEAD [file]

# 用上次提交的内容替换暂存区的内容,保留工作区的内容
git reset --mixed HEAD [file]

# 撤销某次提交的内容
git revert commit-id                                    # 撤销某次提交的内容
git revert -m 保留的分支序列号[1或者2] 某次合并的commit-id   # 撤销某次分支合并

stash

# 保存工作现场
git stash

# 恢复工作现场
git stash pop

git stash apply stash@{0}
git stash drop stash@{0}

# 查看工作现场
git stash list

分支

分支就是一个指针,指向 commit,HEAD 也是一个指针,指向分支,比如 HEAD->master->commit。
参考 分支

查看分支

git branch
git branch -r   # 查看远程分支
git branch -a   # 查看所有分支

新建分支

git branch dev          # 新建分支,新分支指向 HEAD 所指向的 commit ,该 commit 不一定是最新的 commit 
git checkout dev        # 切换分支

git checkout -b dev     # 新建并切换分支,新分支指向 HEAD

git branch dev commit-id | HEAD^ | origin/dev | v0.1            # 新建分支,新分支指向某个 commit-id
git checkout -b test commit-id | HEAD~10 | origin/dev | v0.1    # 新建分支,新分支指向某个 commit-id

删除分支

git branch -d dev       # 删除分支
git branch -D dev       # 强制删除分支,当 dev 分支没有进行过合并的时候,普通 -d 无法删除 dev 分支,必须强制 -D 删除

重命名分支

git branch -m dev develop  # 把分支 dev 重命名为 develop

合并分支

git merge dev                       # 把 dev 分支合并到当前分支
git merge dev --no-ff -m '提交信息'  # 把 dev 分支合并到当前分支,并且禁止使用快速合并

切换分支

git checkout master     # 切换到 master 分支
git checkout -          # 切换到上一次的分支

标签管理

标签就是一个指针,指向某个 commit。标签和 commit 的关系就像域名和 ip 地址的关系。
标签和分支没有关系,标签不属于某个分支,标签只是某个 commit-id 的别名。

创建标签

git tag v1.0                        # 在 HEAD 指向的 commit-id 处打一个标签
git tag v1.0 commit-id

删除标签

git tag -d v1.0                     # 删除本地标签
git push origin :refs/tags/v1.0     # 删除远程标签

推送标签

git push origin v1.0
git push origin --tags

远程

参考 [远程][2]
[2]: http://www.ruanyifeng.com/blog/2014/06/git_remote.html

clone

git clone 支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等。
该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
克隆版本库的时候,所使用的远程主机自动被Git命名为origin,如果想用其他的主机名,需要用git clone命令的-o选项指定。

git clone <版本库的网址>
git clone <版本库的网址> <本地目录名>
git clone -o <远程主机名称> <版本库的网址>

remote

Git要求每个远程主机都必须指定一个主机名,git remote命令就用于管理主机名

git remote                          # 列出所有远程主机
git remove -v                       # 列出所有远程主机以及远程主机的网址
git remote add origin url           # 添加远程主机 origin
git remote rm origin                # 删除远程主机 origin
git remote rename origin hello      # 重命名远程主机 origin 为 hello
git branch -a                       # 查看所有分支,包括远程分支

fetch

将某个远程主机的更新,取回本地,通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响

# 将某个远程主机所有分支的更新,全部取回本地
git fetch origin

# 将远程主机的 master 分支的更新,取回本地
git fetch origin master
git checkout master

# 将本地 master 分支与远程 origin/master 分支合并
git merge origin/master
# 或者
# 将本地 master 分支 rebase 到远程 origin/master 分支
git rebase origin/master

pull

取回远程主机某个分支的更新,再与本地的指定分支合并,相当于先 fetch 再 merge

# 取回 origin 主机的 next 分支,与本地的 master 分支合并
git pull origin next:master

# 取回 origin 主机的 next 分支,与本地的当前分支合并
git pull origin next

push

将本地某个分支的更新,推送到远程主机的指定分支。push 的执行结果必须是 "快速向前" (fast forward) 的,否则会报错。

# 把本地 master 分支的更新,推送到远程主机 origin 的 next 分支
git push origin master:next

# 把本地 master 分支的更新,推送到远程主机 origin 的 master 分支。如果后者不存在,则会被新建
git push origin master

rebase

参考:http://gitbook.liuhui998.com/4_2.html
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html?utm_source=tuicool&utm_medium=referral

git fetch
git rebase origin/dev
git rebase -i origin/dev    # -i 可以合并多次 commit
git rebase --abort # 将当前分支返回到 rebase 之前的状态
git rebase --continue # 如果有冲突,解决冲突之后,先 git add . 然后 git rebase --continue ,就可以继续合并分支

分支关联

本地某个分支如果和远程主机的指定分支相关联,则 push 和 pull 操作都可以省略很多参数

# 把本地当前分支的更新,推送到与本地当前分支相关联的远程分支
git push

# 取回与本地当前分支相关联的远程分支的更新,并且和本地当前分支合并
git pull

本地分支与远程分支可以手动建立关联,某些操作会自动关联

# 自动将远程仓库的 master 和本地仓库的 master 关联。不管远程有几个分支,本地克隆的版本库只有一个 master 分支,其他的远程分支不会同步到本地,因为远程的 master 分支是默认分支。
git clone url

# 将本地 master 分支的内容推送到远程主机 origin 的 tester 分支,同时为这两个分支建立关联
git push -u origin master:tester

# 将本地 master 分支与远程主机 origin 的 tester 分支建立关联
git branch --set-upstream-to origin/tester master

# 在 origin/dev 指向的 commit-id 上创建本地分支 test ,并且把本地分支 test 与远程分支 dev 建立关联
git branch test origin/dev
git checkout -b test origin/dev
# 如果只是把 origin/dev 指向的 commit-id 添加到 git branch test commit-id 或者 git checkout -b test commit-id,则新建的分支 test 不会与远程分支 dev 建立关联

删除远程分支

# 如果省略本地分支名,等同于推送一个空的本地分支到远程分支,相当于删除远程分支
git push origin :master

# 也可以通过 --delete 参数删除
git push origin --delete master
上一篇下一篇

猜你喜欢

热点阅读