目录
Git工作流中有三个重要点:
-
Remote远程仓库,是push的目的地
-
Repository本地仓库,是commit目的地
-
workspace工作区,是当前编辑区
注意:所有操作都是基于本地分支和本地缓存的远程分支,只有将改动push出去,才能修改版本库(真实远程分支)的内容!!!
举例:git fetch操作,是将真实远程分支拉取到本地缓存起来,而git pull则是将真实远程分支拉取到本地缓存后,与本地分支进行合并!
Git初始化
# 1. 在github上创建项目仓库
# 2. 配置本地git
git config --global user.name "你的名字或昵称"
git config --global user.email "你的邮箱"
# 3. 初始化本地仓库-提交-链接远程仓库
git init
git add .
git commit -m "first commit" (first commit 本次提交的内容)
git remote add origin <your project git url>
git push -u origin master
git push
Git配置
git配置基本上都在config配置文件中
配置级别从顶层到底层:
system | global | local |
---|---|---|
系统 | 用户 | 当前仓库 |
底层配置会覆盖顶层配置
# 查看系统配置
git config --system --list
# 查看用户配置
git config --global --list
# 查看当前仓库的配置
git config --local --list
可以通过命令来查看当前git的所有配置
# 检查当前config所有配置
git config --list
git初始化配置用户信息
git config --global user.name "xxx"
git config --global user.email "xxx"
init
使用git init
用于初始化本地仓库,一般流程为
git init
git add .
git commit -m "initial commit"
注意:初始化项目后会生成.gitignore
文件,该文件在第一次被提交后,再做修改则不会起作用!!!
原因:.gitignore
只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
clone
使用git clone
将远程仓库拉下来,一般流程为
# 将代码拉下来放在当前目录中
git clone xxx链接
# 将代码拉下来放到指定目录中
git cloen xxx链接 xxx目录
commit
提交跟踪文件的改动,会将改动提交到当前所在的分支上,一般流程为
git add .
git commit -m "comment"
# 使用-a参数免去add操作,直接提交tracked文件,但是没有tracked的文件不会提交
git commit -a "comment"
branch
用于查看分支,新建分支和修改分支
# 查看所有分支
git branch -a
# 新建本地分支
git branch xxx
# 建立本地分支,并与远程分支关联
git branch xxx origin/xxx
# 修改本地分支名
git branch -m oldxxx newxxx
# 删除本地分支
git branch -d xxx
# 强制删除本地分支
git branch -D xxx
push
用于将本地暂存区推送到远程、修改远程分支等操作
# 推送分支
git push origin 本地名:远程名
# 如果推送到远程同名分支可以简写,不存在会被创建
git push origin xxx
# 删除远程某个分支(本地空分支推送)
git push origin :远程名
# 等同于
git push origin --delete 远程名
# 将当前分支推送到远程origin主机对应分支
git push origin
# 可以通过-u指定远程主机,这样之后就不用指定origin
git push -u origin 分支名
# 若远程主机被-u指定后,可以简写
git push
pull
拉取远程分支到本地,操作其实是两步:拉到本地远程分支,合并本地远程与本地分支:
origin dev—>origin/dev—>dev
注意:此处的合并会将commit记录合并了,不会产生merge的commit
# 将远程主机的某个分支拉到本地的某个分支上合并
git pull 远程主机 远程分支:本地分支
git pull origin dev:xiaopi3
# 如果与当前分支合并,可以省略本地分支
# 拉远程dev与当前本地分支合并
git pull origin dev
# 等同于
git fetch origin
git merge origin/dev
# 拉取本地分支对应的远程分支并合并
git pull
# 可以采用rebase模式
git pull --rebase origin dev:xiaopi3
checkout
git checkout
命令用于切换分支或恢复工作树文件。git checkout
是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区。对于新建文件,由于没有纳入git管理,会被带入切换的分支中,解决方法是commit一下再切换
git branch -a # 查看当前所有分支
git checkout 分支名 # 切换到本地分支
git checkout -b 本地分支 origin/远程分支 # 切换到远程分支对应的本地分支
同时,checkout命令可以用来合并冲突,常在git pull后用:
git checkout --ours file1 file2 file3
// ours:保留当前所在分支的修改
// theirs:保留其他分支的修改
merge
合并两个或者多个分支的内容,一般流程
# 将xxx合并到当前分支,并自动commit
git merge xxx
log
查看提交记录
# 查看提交日志,以下三种都可以
git log # 详细
git log --pretty=oneline # 简单
git reflog # 操作记录
# 回滚本地记录
git reset --hard xxxid
# 回滚远程记录
git push -f [origin xxx]
rm
用于删除工作区、版本库(远程)、暂存区的文件(如果删除文件夹,需要-r参数)
# 删除本地文件,并将改动放入暂存区
# 删除工作区文件,等同于直接资源管理器删除文件,提交后版本库自动删除相应文件,注意如果本地已经修改了的文件再删除会报错(删除的文件必须和版本库一致,才能删除)
git rm xxx.txt
# 删除本地文件,并将改动放入暂存区
# 删除文件,强制,无论本地和版本库是否一致,无论是否放入了暂存区,都可以删除,push后版本库相应文件也会删除
git rm -f xxx.txt
# 取消文件跟踪,本地不删除,删除暂存区文件,并将改动放入暂存区
# 只删除暂存区文件,工作区保留,即已经被git add过的文件,处理后将不再被git跟踪,push后版本库也删除相应文件
git rm --cached xxx.txt
reset
git reset
命令用于将当前分支的HEAD
复位到指定状态。一般用于撤消之前的一些操作(如:git add
,git commit
等)。该命令不会改变工作区的内容!
HEAD
表示当前分支最新的提交
git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
将当前分支重置到指定commit,默认为HEAD
–hard
从commit之后的任何改动都被丢弃,并将HEAD指向commit
# 第一次提交:add test1.c
# 第二次提交:add test2.c
# 第三次提交:add test3.c ---> HEAD
# 将HEAD往过去挪一步:此时抛弃了test3.c,只保留了前两个,但是不改变工作区内容
git reset --hard HEAD~1
# 撤销最近一次commit,将其挪回工作区
git reset head~1
rebase
用于将一个分支的修改,合并到当前分支
应用场景
使用情形:同一个分支上,A和B都做了commit,其中一个人做了push,另一个人push时就会失败
此时几种办法:
pull:直接拉取会出现冲突,解决冲突后可以提交,等价于merge
merge:将远端代码拉下来与本地代码merge,然后解决冲突,再add、commit、push
rebase:将当前的commit存为patch,然后拉取最新代码,然后自动合并
图解:
origin和mywork在C2的基础上往右前进两个commit:
如果采用merge,此时工作流为:
如果采用rebase,将改动放置到临时区,然后拉取最新代码,然后合并:
其他操作
git status
查看当前项目的跟踪情况
git fetch
将远程分支拉取到本地远程分支上
本地仓库分为本地分支和本地远程分支:本地远程分支前面加了origin
该命令将远程分支拉到本地远程分支上,但是不会与本地分支合并
git fetch:相当于是从远程获取最新版本到本地,不会自动合并。
$ git fetch origin master
$ git log -p master..origin/master
$ git merge origin/master
以上命令的含义:
- 首先从远程的
origin
的master
主分支下载最新的版本到origin/master
分支上 - 然后比较本地的
master
分支和origin/master
分支的差别 - 最后进行合并
git diff
比较工作区和暂存区文件差异
git diff <file> # 比较当前文件和暂存区文件差异 git diff
git diff <id1> <id2> # 比较两次提交之间的差异
git diff <branch1> <branch2> # 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异
git diff --cached # 比较暂存区和版本库差异
git diff --stat # 仅仅比较统计信息
git remote
# 去除本地缓存的远程主机不存在的分支
git remote prune origin
# 将本地仓库关联远程仓库
git remote add origin xxxurl
git-keygen
生成ssh密钥,设置好用户名和邮箱后
ssh-keygen -t rsa -C "邮箱"
连续三个回车即可,将生成的两个文件中的pub后缀的拷贝到github ssh设置中即可
git 暂存工作
将当前工作区的修改暂存起来,之后可以在任意分支上pop出来
git stash # 将当前工作保存
git pop # 将上一次保存的工作恢复到工作区
# 给stash备注
git stash save xxxx
# 查看当前保存的工作表
git stash list
# 查看储存单元和最新提交的diff
git stash show
# 恢复指定储存单元
git stash pop 索引
典型应用场景
1.新建本地分支,修改代码,提交到远程同名分支
# 切换到基础分支
git checkout abc
# 在该分支上进行coding,结束
# 查看所有分支
git branch -a
# 新建本地分支
git branch xxx
# 切换到分支
git checkout xxx
# 提交修改到暂存区
git add .
git commit -m "xxx"
# 提交代码到远程分支
git push origin abc
2.重命名本地分支,删除远程分支,并提交到远程
# 查看当前分支
git branch -a
# 重命名原来本地分支
git branch -m oldxxx newxxx
# 切换到分支
git checkout xxx
# 提交修改到暂存区
git add .
git commit -m "xxx"
# 删除远程原来分支
git push origin --delete oldxxx
# 提交代码到远程分支
git push origin newxxx
–delete可以写成-d
3.重置本地仓库
有时候我会把本地的代码彻底搞乱,因此需要放弃本地修改,选择从远端仓库拉取代码覆盖,具体操作如下
git fetch --all
git reset --hard origin/[branch-name]
git pull
4.拉取远程最新分支,并与本地分支合并
由于某个分支上有人push了最新的代码,我们在push代码时如果需要防止与其冲突或者某个分支新增了功能,我们当前分支需要使用,则需要将其分支与我们的进行合并
# 切换到分支a
git checkout a
# 将a分支最新代码拉下来
git pull
# 切换回分支b
git checkout b
# 合并
git merge a
# 推送合并分支到b
git push
5.报错内容出现upstream branch与current branch不匹配
git push -u origin currentxxx
6.中途修改让.gitignore文件生效
一般而言创建仓库时添加.gitignore文件,之后add、commit、push会自动生效,但是有时候中途修改该文件后也想让其立即生效,需要清除一下缓存cache,才能使其生效
git rm -r --cache # 清除缓存
git add .
git commit -m "update .gitignore"
git push origin master