常用命令
branch
查看
查看本地分支:git branch
* 所在的是当前分支
查看所有分支:git branch -a
切换
切换分支之前先git stash
暂时保存修改内容
切换到远程分支并新建本地映射分支:git checkout -b 本地分支名x origin/远程分支名x
切换本地branchName分支:git checkout branchName
删除 & 创建
删除本地localBranchName分支:git branch -d localBranchName
删除远程remoteBranchName分支:git push origin --delete remoteBranchName
创建本地分支:git branch newBranch
创建本地分支并切换过去git checkout -b new_branch
推送并创建远程分支:git push origin localbranchName:remotebranchName
通常名字相同
提交
提交分支:git commit -m "commit message"
合并
merge合并:
将branchA分支合并到master分支:先切换到master分支,git merge branchA
如果产生冲突,则需要手动处理冲突,然后重新 add冲突文件 和 分支commit
取消合并:git reset --hard HEAD~
rebase合并:
将branchA分支合并到master分支:先切换到branchA分支,git rebase master
修改冲突后的提交不是使用commit命令,而是执行rebase命令指定 --continue选项。git add CONFLICT.txt
然后git rebase --continue
。这时master分支就可以fast-forward了
先切换到master分支,再执行:git merge issue3
取消rebase:指定 --abort选项。
rebase
合并代码
rebase和merge合并代码的区别
改写提交的历史记录
先git reflog
查看提交记录
然后git rebase -i HEAD~n
获取前n条提交记录,编辑提交记录
revert & reset 修改提交
cherry-pick
安装
省略(猪都会安)
在命令行执行 git --version
能看到版本的时候,就成功了。
设置用户名密码
git config --global user.name "your_username"
git config --global user.email your_email
git cinfig --list #查看所有配置
概念
Git文件三种状态和工作模式
1、已提交,数据已经安全的保存在本地数据库中
2、已修改,修改了文件,但没有保存到数据库中。
3、已暂存,对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
针对Git文件的三种状态,Git项目有三个工作区域:工作区、暂存区、Git仓库
工作区:简单理解为电脑里能看到的目录,比如自己创建的本地项目目录。
暂存区:Git的版本库里存了很多东西,其中最重要的称为stage的暂存区,还有Git自动创建的第一个分支master,以及只想master的一个指针HEAD
Git仓库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git工作流程如下:
在工作区修改某些文件
对修改后的文件进行快照,然后添加到缓存区
提交更新,将保存在缓存区的文件快照永久转储到Git仓库
操作
基本操作
初始化git本地库
新建一个目录,作为工作区。
通过git init
命令在本地初始化一个本地仓库,执行该命令会在本地初始化一个没有任何文件到空仓库。
添加文件到暂存区
在 .git 统计目录下新建文本文件git01.txt,使用git status
查看工作目录与暂存区文件状态
通过git add 文件名
命令添加文件到暂存区,后面需要跟 path
提交文件到本地库
通过git commit
命令将更改记录提交到存储库,通常会使用git commit -m '更新说明'
命令,加上更新说明
命令git commit -a
组合命令,添加到暂存区并提交到本地库
提交日志
使用git log
命令
查看本地仓库
使用命令git ls-files
时光穿梭机
在多人开发环境中,使用Git版本控制工具对项目版本进行管理时,通常会对项目不同版本的文件进行查看,项目历史版本,未来版本的切换操作。
1、修改文件与文件提交
修改文件之后,需要先add,再commint。
没有add就直接commit会不成功。
查看工作区和本地库的差别,使用git diff HEAD --文件名
误提交-撤销
命令git reset HEAD
撤销add的文件
2、版本回退
1、多版本commit提交未push,回退
使用命令git -reset --hard HEAD^
一个^
表示回退上一个版本,有几个^
表示回退几个版本。
git reset --hard HEAD~1
波浪线后面跟几就会退几个版本。
回到未来的版本
git reset --hard 版本号前几位
(差不多需要五位),退到这个版本号对应的版本。
2、已经push到远端后
重点使用命令git revert
代替git reset
命令 | 是否抹掉历史 | 使用场景| |
---|---|---|
git resest | 是,回滚到历史将消失 | 本地未push的记录 |
git revert | 否,历史记录保留,回滚后重新生成提交记录 | 回滚已push内容 |
过程中如果遇到问题(如处理冲突时搞乱了),使用命令git revert --abort 取消本次回滚。 |
注意:
1、已经commit但未push时,回退到版本a,则版本a之后的修改将被丢弃
2、git reset 默认会将被丢弃的记录所改动的文件保留在工作区中,以便重新编辑和再提交。加上 --hard 选项则不保留这部分内容,需谨慎使用。
3、日志
当我们清空了命令窗口之后,想要跳到未来版本,需要先拿到版本号。但是这时使用git log
命令,只能查询到到当前版本及之前的日志,没有后面版本的日志。
这时需要使用git reflog
命令。查询记录在本地的HEAD和分支引用在过去指向的位置。
4、文件删除
在Git中,删除文件同样是一个修改操作。
当我们写了一个文件,add 并 commit之后,在被我们手动删除了。这时候它在git本地仓库还是存在的
恢复命令git checkout -- 文件名
(两个 - 符号),从本地仓库拉取指定文件到工作区。
删除命令git rm 文件名
,同时删除工作区和本地仓库的指定文件。
远程仓库
克隆远程项目到本地
使用命令git clone URL
推送本地代码到远程
先创建远程仓库,点击右上角 + ,选择 new repository。填写信息后,点击create
在本地执行
git init #只有第一次操作库需要
git add README.md #新增文件
git commit -m "first commit"
git remote add origin 远程库https链接/ssh链接 #只有第一次操作库需要绑定
git push -u origin master
SSH需要申请公钥和私钥,本地执行ssh -keygen -t rsa -C "github账户邮箱"
拷贝公钥到github。点击右上角头像,点击settings,选择左侧SSH and GPG keys
检查公钥配置是否成功,使用命令ssh -T git@github.com
,
创建远程分支并推送
git checkout -b my-test //在当前分支下创建my-test的本地分支分支
git push origin my-test //将my-test分支推送到远程
git branch --set-upstream-to=origin/my-test //将本地分支my-test关联到远程分支my-test上
git branch -a //查看远程分支
Git分支
命令:
git checkout branchA #切换到指定branchA
git checkout -b new_branch #新建分支并切换到新建分支new_branch
git branch -d branchA #删除分支branchA
git branch #查看所有分支
git merge branchA #合并分支branchA到主干
git branch -m|-M oldbranch newbranch #重命名分支,如果newbranch名字已经存在,则需要使用-M强制重新命名,否则使用-m重命名
git fetch #读取远程仓库状态
在分支进行的提交操作,不会影响主干master上的文件。
切到master再去合并分支,合并命令之后,分支修改的内容才会到master。
切换分支之后,本地的文件夹会对应变化。
分支的push和pull
命令:
git branch -a #查看本地和远程分支
git push origin branch #推送本地分支branch到远程
git push origin :remote_branch #删除远程分支(本地相应分支保留)
git checkout -b local_branch origin/remote_branch #拉取远程指定分支remote_branch并在本地创建分支local_branch
拉取远程分支并创建本地分支
会在本地新建分支x,并自动切换到该本地分支x,采用此种方法建立的本地分支会和远程分支建立映射关系。
git checkout -b 本地分支名x origin/远程分支名x
分支操作冲突
例如当master和branch01,分别修改了某个文件,这时执行merge操作就会产生冲突。
会产生(master | MERGING)状态
解决冲突:
直接修改文件到想要的结果,然后再执行add命令,最后commit
(master | MERGING)状态变回到(master)状态
多人协作操作冲突
p1修改了文件,然后commit提交本地库,push推送到远程库。
p2也修改了同一个文件,commit提交到本地库(没问题),这时push推送到远程库的时候就会出问题。会被拒绝
解决冲突:
每次推送之前先拉取最新的代码
标签
基本命令git tag
git tag tag_name #新建标签 默认为HEAD
git tag -a tag_name -m 'xxx' #添加标签并指定标签描述信息
git tag #查看所有标签
git tag -d tagname #删除本地标签tagname
git push origin tagname #推送tagname标签到远程
git push origin --tags #推送所有标签到远程
git push origin :refs/tags/tagname #删除远程变迁tagname
git对某一时间点上到版本打上标签
IDEA下使用Git
在使用IDEA的时候,项目中有些文件不需要上传到Git,这时需要配置。
方法一:逐个commit文件,例如src pom等
方法二:右键这个项目,点击Git——Commit Directory,然后选择要提交到文件
方法三:集成ignore插件。右键项目根目录,点击new,点击 .ignore file ,点击 .gitignore file (Git)创建这个文件。添加文件进:右键想要添加到文件,点击Add to .gitignore file
拉取远程分支
右键项目,找到Git,找到fetch,这样获得远程仓库最新状态。
点击Git Branches,选取远程分支,点击checkout as…
本地分支冲突
多人协作冲突
多个开发都在同一个分支下操作。假设1号commit and push,2号进行了commit。当2号进行push的时候,git会出现push rejected。需要先合并。