2.GIt基础
3.Git在idea上的使用
任何时候都能通过如下命令
Ctrl+C 结束输错的命令
Ctrl+A 跳到命令最前方
Ctrl+E 跳到命令最后方
查看版本 git --version
创建版本库
新建文件夹,在此文件夹下执行初始化命令
git init 初始化出一个版本库
首次使用前的配置
git config --global user.name"lvhouhou"
git config --global user.email"邮箱"
对于user.name和user.email来说,有3个地方可以设置
1./etc/gitconfig(几乎不会使用),git config --system
2.~/.gitconfig(很常用) git config --global
3.针对于特定项目,.git/config文件中 git config --local
优先级越来越高
查看配置信息
git config --list
git config --user.name
git config --user.email
ssh-keygen 生成公钥和私钥,存在.ssh
将公钥配置到GitHub
一个GitHub可以配置多个SSH,自己可以多台电脑使用
什么是SSH key:
在使用GIT与远程的服务器进行连接的时候,需要生成一个SSH key,他用于在你的计算机和远程服务器(gitlab,github....)建立一个
“安全的连接"(secure connection),这样你每次连接的时候,都不需要输入用户名密码,而且他比单纯的用户名密码机制更加的安全。
从现有仓库克隆,克隆完整数据
git clone git://github.com/zhanglong/zl.git
查看日志
查看提交历史 git log 只能查看当前版本 和 之前版本信息
-p 展开显示每次提交内容差异
-n 仅显示最近的n次更新
--stat 仅显示简要的增删改行数统计
git log --graph 以图形化的方式显示
git reflog 可以查看所有的操作记录和版本信息
远程协作
git pull 从远程版本库拉取到本地
git push 将本地版本库推送到远程版本库
git pull origin 远程分支名
git push origin 远程分支名
版本回退
回退到上一版本 git reset --hard HEAD^
git reset --hard HEAD~1
回退到特定版本 git reset --hard commit_id (版本号不需要写全 一部分就可以)
从远程仓库拉取
git pull==git fetch+git merge
拉去后回尝试自动合并
Git rebase
rebase:变基,即改变分支的根基,与merge相似却又不同
git rebase origin
rebase 过程也会出现冲突,解决冲突后,使用git add添加,然后执行
git rebase -- continue
多人协作的工作模式通常是这样:
用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
Untracked files 未追踪的文件(未添加add)
命令帮助
git config --help // 查看git config命令详细用法
git help config // 功能同上
查看文件状态(未添加还是未提交)
git status 查看文件的情况 查看文件未添加还是未提交
三种状态
-
所有文件都提交了 nothing to commit ,working tree clean
-
红色 说明有文件没有被添加
-
绿色 说明文件被添加了没有被提交
撤销修改
git checkout +被撤销的文件名字
连接码云
-
有码云账户
-
在电脑中生成公钥和秘钥
桌面打开git 命令行 执行生成命令
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
执行命令 一直回车
打开用户文件夹可以看到秘钥文件夹 user/.ssh下id_rsa.pub为公钥
-
在码云账户中配置SSH公钥
(从云端克隆和推送到云端)
码云的基本使用
-
创建仓库
-
将仓库下载本地 克隆
在要保存的文件夹内打开git,输入
git clone +码云仓库地址。这样就完成了下载克隆
-
本地写代码
-
推送到仓库上
-
文件提交到本地仓库 add commit
-
将本地仓库推送到码云 git push 推送
-
-
更新本地项目git pull
2.GIt基础
git工作模式
git基础
文件的三种状态
已修改(modified)
已暂存(staged)
已提交(commited)
本地版本库与服务器版本库
本地版本管理
暂存区(stage,index)
添加:
git add 将修改的文件存到暂存区 git add . 添加所有文件到暂存区 git add + 文件名 将一个文件添加到暂存区
提交:
git commit -m"提交标识信息” 将暂存区的文件提交到版本仓库提交更新,每次提交前git status查看是不是已经暂存了(好习惯)git commit -m"initial project version"
Git的提交id(commit id )是一个摘要值,这个摘要值实际上是个sha1计算出来的git commit --amend -m "提交信息" 将上次的提交信息更改为这次的amend修复
git commit -am '提交信息' 添加并提交(只能处理老文件,新建的文件不行)
删除:
git rm +文件 删除目录或文件(递归删除) (删除文件并将删除文件存到暂存区,从暂存区恢复使用: git reset HEAD +文件名 从暂存区恢复到工作区。
git checkout -- 文件名 将工作区的删除动作丢弃掉rm +文件 删除文件(被删除的文件没有添加到暂存区,恢复时需先使用git add + 文件 添加到暂存区,再执行git reset HEAD +文件名 git checkout -- 文件名)
合并冲突:
git checkout --文件名 作用:丢弃对工作区的此文件的变更(恢复到最后一次提交到暂存区的状态)
git reset HEAD 文件名 作用:将之前添加到暂存区的的内容移除到工作区
stash暂存
保存工作现场 git stash 查看所有保存现场 git stash list恢复现场 git stash apply (stash内容并不删除,需要通过git stash drop stash@{0}手动删除)
git stash pop (恢复的同时也将stash内容删除)
git stash apply stash@{0} 指定从哪个版本恢复
Git标签
标签有两种:轻量级标签(lightweight)与带有附注标签(annotated)
轻量级标签是个指针,附注标签是个对象
-
查看全部标签——git tag
-
查看某个标签的详细信息——git show + 标签名
-
创建一个轻量级标签——git tag v1.0.1
-
创建一个带有附注的标签——git tag -a v1.0.2 -m'release version'
-
将标签推送到远程 —— git push origin +标签名
-
将标签推送到远程——git push origin +标签名
-
将本地未推送的所有标签推送到远程——git push origin --tags
-
删除远程标签——git push origin :refs/tags/标签名
-
删除远程标签——git push origin --delete tag v5.0
-
删除标签——git tag -d tag_name
Git refspec
Git远程操作
-
git remote add origin url (自己的Github仓库地址)(HTTPS方式或SSH公钥) 推送到仓库
-
git push -u origin master 关联远程分支
查看远程仓库:
-
git remote show 显示与此项目相关联的所有的仓库
-
git remote show origin 显示远程仓库origin的详细信息
git 2.0之前push默认将本地的推送到远程的已经存在的同名分支
git 2.0之后push默认将本地的推送到git pull 的来源远程分支
下图表示本地有1条提交,未推送到远程
打开Git GUI 图形化界面 gitk
git gui 暂存区和工作区的界面
分支操作
新建分支:
-
gitlab上新建远程分支
-
本地新建分支 git branch +分支名
-
创建并转向所创建的分支 git checkout -b +分支名
查看分支:
-
查看分支 git branch
-
git branch -a 查看本地和远程
-
git branch -r 查看远程分支
注:名称前面加* 号的是当前的分支,远程分支会用红色表示出来
查看分支是未显示新创建的远程分支时用git pull更新一下
分支关联:
-
远程新建了一个分支,本地没有该分支。
可以利用 git checkout --track origin/branch_name ,这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。
-
本地新建了一个分支 branch_name,但是远程没有。
这时候 push 和 pull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支,所以可以利用 git push --set-upstream origin branch_name ,这样就可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步。
查看分支最后一次提交信息 :
-
git branch -v 查看本分支的最后一次提交
-
git branch -av 查看所有分支最后一次的提交
删除分支:
git branch -d +分支名 (d表示delete)不能在本分支下删除分支,要在其他分支下才能删除,当分支独有数据未合并时,需再输入git branch -D + 分支名切换分支
-
删除本地分支
git branch -d branch_name
-
删除远程分支
git branch -r -d origin/branch-name git push origin :branch-name 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
切换分支:
-
git checkout +分支名
-
创建并转向所创建的分支 git checkout -b +分支名
分支合并 :
-
git merge branch_name 将branch_name合并到当前分支下
分支合并冲突,两个分支修改了同一文件的同一部分内容,需要先解决冲突,然后提交 git add ./文件名 git commit 。
更新和推送:
推送到远程版本库 git push
push操作的完整命令是:git push origin local_branch:remote_branch
推送本地分支local_brancn到远程分支remote_branch
推送本地分支 git push origin server_branch
从远程拉取更新git pull
pull操作的完整命令是:git pul origin local_branch:remote_branch
git push 和git push origin HEAD
-
git push origin master
表示,将本地的master
分支推送到origin
主机的master
分支。如果master
不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master等同于git push origin --delete master
上面命令表示删除origin
主机的master
分支。如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
上面命令表示,将当前分支推送到origin
主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。
git push
如果当前分支与多个主机存在追踪关系,则可以使用-u
选项指定一个默认主机,这样后面就可以不加任何参数使用git push
。
git push -u origin master
上面命令将本地的master
分支推送到origin
主机,同时指定origin
为默认主机,后面就可以不加任何参数使用git push
了。
不带任何参数的git push
,默认只推送当前分支,这叫做simple
方式。如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull
合并差异,然后再推送到远程主机。
最后,git push
不会推送标签(tag),除非使用–tags
选项。
git push origin --tags
将当前分支推送到远程的同名的简单方法,如下 -
git push origin HEAD
将当前分支推送到源存储库中的远程引用匹配主机。 这种形式方便推送当前分支,而不考虑其本地名称。如下 -
git push origin HEAD:master
比较差异
1.diff用来比较本地的差异
暂存区————工作区————版本库————远程版本库
-
比较暂存区与工作区有哪些差别 ——git diff
-
比较工作区与最新已提交(版本库)的差别——git diff HEAD
-
比较暂存区和已提交(版本库)的差别——git diff --cached commit_id
-
比较暂存区和最新的已提交(版本库)的差别——git diff --cached
2. 对比两个分支差异
-
远程的比较
查看2 个分支的区别:master, dev
1.查看 dev 有,而 master 中没有的:
git log dev ^master 1
2.查看 dev 中比 master 中多提交了哪些内容:
git log master..dev1
注意,列出来的是两个点后边(此处即dev)多提交的内容。同理,想知道 master 比 dev 多提交了什么:
git log dev..master1
3.不知道谁提交的多谁提交的少,单纯想知道有什么不一样:
git log dev...master
4.在上述情况下,再显示出每个提交是在哪个分支上:
git log --left-right dev...master
注意 commit 后面的箭头,根据我们在 –left-right dev…master 的顺序,左箭头 < 表示是 dev 的,右箭头 > 表示是 master的。
截图中表示这三个提交都是在 master 分支上的
总结:
master 主分支(默认),稳定分支,项目发布与部署分支
dev开发的稳定分支,不允许直接提交
master指向提交
HEAD—— 是个指针,指向的是当前分支的引用标识符,
origin ——指远程分支
origin/master——表示远程的master分支
更新前先提交保存
解决完冲突后要再commit才能推送。
新建远程分支可能要给git pull 才能发现
Fast forword快进(自动merge成功)
git pull和git pull --rebase的使用
使用下面的关系区别这两个操作:git pull = git fetch + git merge 拉取远程的更新并自动合并
git fetch 拉取远程的更新
git merge 和本地的合并
git pull --rebase = git fetch + git rebase
git merge和git rebase的区别。
假设有3次提交A,B,C。
在远程分支origin的基础上创建一个名为"mywork"的分支并提交了,同时有其他人在"origin"上做了一些修改并提交了。
其实这个时候E不应该提交,因为提交后会发生冲突。如何解决这些冲突呢?有以下两种方法:
1.git merge 合并,会将本地提交的和远程pull下来的形成一个新的版本,会形成菱形,让人很困惑。
merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。
2.git rebase 合并冲突,会废弃自己之前的,当它不存在(图中用虚线表示),本地提交和pull下来的形成一个新的版本,版本路线还是直线,避免了菱形的产生,让大家易于理解。
在rebase的过程中,有时也会有conflict,这时Git会停止rebase并让用户去解决冲突,解决完冲突后,用git add命令去更新这些内容,然后不用执行git-commit,直接执行git rebase --continue,这样git会继续apply余下的补丁。在任何时候,都可以用git rebase --abort参数来终止rebase的行动,并且mywork分支会回到rebase开始前的状态。
git merge和git rebase 解决完冲突后的提交推送区别:
git merge 解决完冲突后,add 修改,commit 就可以了
git rebase 解决完冲突后,add,不用执行commit ,直接执行git rebase --continue则会继续apply余下的补丁,
merge 和 rebase
现在我们有这样的两个分支,test和master,提交如下:
D---E test
/
A---B---C---F--- master
在master执行git merge test,然后会得到如下结果:
D--------E
/
A---B---C---F----G--- test, master
在master执行git rebase test,然后得到如下结果:
A---B---D---E---C‘---F‘--- test, master
merge操作会生成一个新的节点,之前的提交分开显示。 而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。
3.Git在idea上的使用
1.更换Git账户
在idea中File-->Settings-->Appearance-->System Settings-->Passwords,选择不保存密码(Do not save),重启项目。再次提交会让输入账户和密码