目录
Git环境 配置
三棵树
查看配置信息
Git 创建仓库
git init
使用方法
Git 常用指令
分支命令
合并分支到master上的流程
git commit,git push,git pull,git fetch,git merge的含义与区别
git blame
git bisect
冲突标记
git的版本回退
查看与对比历史提交记录
查看历史提交信息
查看完整的历史提交(commit)信息
git diff用来比较文件之间的不同,其基本用法如下:
git分支解析
git tag的用法及意义
使用方式
idea整合git
在IDEA中设置.ignore插件忽略不必要提交的文件
添加模板
下面演示如何通过IDEA将一个项目上传到git上
第一步
第二步生成本地仓库
第三步,建立远程连接,与远程git连接
第四步:使用ssh密钥建立本地git和远端git服务器的免密连接
第五步,点击push,将代码上传到git上
idea从git上直接拉取生成工程
需要注册一个github账号
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
在你下载的git客户端需要配置这些信息,进行账户的初始化
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用 git config
时用 --system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用 git config
时用 --global
选项,读写的就是这个文件。.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config
里的配置会覆盖 /etc/gitconfig
中的同名变量。在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings\$USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,以此作为根目录来定位。
用户信息
配置个人的用户名称和电子邮件地址指令:
$ git config --global user.name "xxxx"
$ git config --global user.email [email protected]
注意:如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里
要检查已有的配置信息,可以使用 git config --list 命令:
$ git config --list
http.postbuffer=2M user.name=xxxx
[email protected]
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。这些配置我们也可以在 ~/.gitconfig 或 /etc/gitconfig 看到,如下所示:
vim ~/.gitconfig
显示内容如下所示:
[http] postBuffer = 2M [user] name = xxxx
email = [email protected]
你可以使用一个已经存在的目录作为Git仓库
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
使用当前目录作为Git仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
使用我们指定目录作为Git仓库。
git init newrepo
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。
指令操作一般流程:先克隆一个项目
git clone git@gitxxxxxxxxxx/xxxxx.git
克隆后会产生一个项目的文件夹,此后我们就可以进入项目文件夹中进行 push pull 等操作,此时就不需要使用项目的git地址了(git@gitxxxxxxxxxx/xxxxxx.git),在项目中直接操作git push 等指令。
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
git branch |
列出所有本地分支(当前分支前面会标一个*号。) |
---|---|
git branch -r |
列出所有远程分支 |
git branch -a |
列出所有本地分支和远程分支 |
git branch |
新建一个分支,但依然停留在当前分支 |
git checkout -b |
新建一个分支,并切换到该分支 |
git branch --track |
新建一个分支,与指定的远程分支建立追踪关系 |
git checkout |
切换到指定分支,并更新工作区 |
git branch -d |
删除分支 |
git push origin --delete |
删除远程分支 |
git fetch |
merge之前先拉一下远程仓库最新代码 |
---|---|
git merge |
合并指定分支到当前分支 |
注意:
1.如果远程新建了一个分支,本地没有该分支。
可以利用 git checkout --track origin/branch_name ,这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。
git checkout --track origin/branch_name
2..如果本地新建了一个分支 branch_name,但是在远程没有。
这时候 push 和 pull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支,所以可以利用 git push --set-upstream origin branch_name ,这样就可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步。
git push --set-upstream origin branch_name
我们使用分支时可以先在本地创建好分支,比如 dev然后使用 git push --set-upstream origin dev推到远端并创建一个名字相同的远端分支
首先切换到master分支上
git checkout master
如果是多人开发的话 需要把远程master上的代码pull下来
git pull origin master
然后我们把dev分支的代码合并到master上
git merge dev
git commit -m "**" : 将暂存区的文件提交,并记录日志信息**
git remote -v :查看当前项目的git地址
git log : 查看历史提交目录,如果嫌日志信息太多可以使用 git log --pretty=oneline
git stash : 备份当前工作区内容,不提交到缓存区
git checkout --
git config --list : 查看配置信息列表
git config --global user.name " peanut" : 设置全局用户名为peanut
git config --global user.email "[email protected]" : 设置全局用户邮箱为 xxx
git pull相当于git fetch + git merge
git add 文件名或目录 #表示将当前文件的修改放入缓存区 先不提交
git commit -m '版本名称' #将缓冲区提交建立一个版本
两个指令可以一块使用:’
git commit -am "xxxxxx"
注意:如果项目中创建了新文件,必须使用add,也就是 git add .(add 和. 之间必须有空格),修改文件可以使用git commit -am "xxxxxx"
保存当前工作区(不想提交,下次还能继续工作区内容)
用途:stash
命令可用于临时保存和回复修改,可跨分支, 比如 git pull 拉代码的时候,或者切换分支的时候,防止冲突和不便,会用到git stash,它的作用是把当前未提交的修改暂存起来,让仓库还原到最后一次提交的状态。
使用案例:
项目正在test分支更新版本我们疯狂的写bug,突然没更新前的版本出bug了(意料之中),此时呢我们要切换到master分支去改bug。此时此刻我test分支上修改的文件还不想提交,但是切换分支会提示我错误有文件未提交(如图一)。那么现在我们一起学习一下 git stash 吧!
(图一)
现在直接输入 git stash 命令,将当前分支存起来,id为adad619 实名制购票
接下来我们就可以随意切换分支了,等你切换到其他分支再切回来的时候,我们想恢复刚刚存储的文件。
现在先输入 git stash list 命令去查看我们“存储”的列表
可以看到我们刚刚存储id为 ‘adad619 实名制购票’ 的信息
有两种方式我们可以恢复
一、用 git stash apply 命令恢复,但是恢复后,stash内容并不删除,这时候再执行 git stash list 命令,id 为 adad619 实名制购票 的储藏项目还会在列表中,你需要用 git stash drop 来删除;
注意: 如果有一个分支上多个 stash,如果需要恢复指定的 stash ,可以在命令尾部加id,如 git stash apply stash@{0} ,同样删除指定 stash 项目则执行如 git stash drop stash@{1} 。
二、用 git stash pop 命令,恢复的同时把 stash 存储列表的内容也删了。这时候再执行 git stash list 命令,id 为 adad619 实名制购票 的储藏项目不会在列表中。
此时再查看 cat
eg:为了fix 一个bug, 先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作
注意:在未
add
之前才能执行stash
!!!!
之后切换到其他分支,然后切换回来
git stash [save message]
save
为可选项,message
为本次保存的注释git stash list
git stash pop stash@{num}
num
是可选项,通过git stash list
可查看具体值。只能恢复一次git stash apply stash@{num}
num
是可选项,通过git stash list
可查看具体值。可回复多次git stash drop stash@{num}
num
是可选项,通过git stash list
可查看具体值git stash clear
替换本地改动
假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:git checkout --
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
如果你要查看文件的每个部分是谁修改的, 那么 git blame 就是不二选择. 只要运行'git blame [filename]', 你就会得到整个文件的每一行的详细修改信息:包括SHA串,日期和作者:
git bisect使用二分搜索来查找出现错误的commit
<<<<<<
<<<<<<< HEAD
b789
=======
b45678910
>>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
head 到 =======里面的b789是您的commit的内容
=========到 >>>>68的是您下拉的内容
git reset –hard 版本号 ,但是现在的问题是加入我已经关掉了命令行或者第三个版本的版本号,我并不知道?那么要如何知道第三个版本的版本号呐。可以通过如下命令获取到版本号: git reflog 演示如下:
通过上面的显示我们可以知道,第三个版本的版本号是 e12928c 那么现在我们可以通过命令: git reset –hard e12928c 返回到第三个版本
git show [commit_id] 查看某次历史提交信息的完整信息
git show HEAD查看HEAD标签当前指向的提交的完整信息
git show master 查看master分支最新一次提交的完整信息
git show master^或git show master~ 查看master分支最新一次提交的父提交的完整信息
git show master^2查看master分支最新一次提交的第二个父提交(也就是父提交的父提交)的完整信息
git log
可以按键盘空格/字母b键将信息向下/向上翻页,也可以按键盘向上/向下箭头向上/向下按行滚动
git log –p输出每一个commit之间的差异信息
git log --stat输出每一个commit之间的差异统计信息
git log--oneline输出历史commit的简短信息
(1)git diff:当工作区有改动,临时区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”;当工作区有改动,临时区不为空,diff对比的是“工作区与暂存区的共同文件”。
(2)git diff --cached 或 git diff --staged:显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的增删改(git diff --cached和git diff –staged相同作用)
(3)git diff HEAD:显示工作目录(已track但未add文件)和暂存区(已add但未commit文件)与最后一次commit之间的的所有不相同文件的增删改。
(3.1)git diff HEAD~X或git diff HEAD^^^…(后面有X个^符号,X为正整数):可以查看最近一次提交的版本与往过去时间线前数X个的版本之间的所有同(3)中定义文件之间的增删改。
(4)git diff <分支名1> <分支名2> :比较两个分支上最后 commit 的内容的差别
(4.1) git diff branch1 branch2 --stat 显示出所有有差异的文件(不详细,没有对比内容)
(4.2) git diff branch1 branch2 显示出所有有差异的文件的详细差异(更详细)
(4.3) git diff branch1 branch2 具体文件路径 显示指定文件的详细差异(对比内容)
参考 Git详解之三 Git分支 - 哈哈那个嗒 - 博客园
命令是用来给当前项目状态(在某次commit后)打标签的,目的是便于以后将项目状态回滚到当时打标签的状态,简单理解:tag就是打一个标记而已,方便取出或回退到这个标记点。也许你会问,直接git checkout
1.查看本项目所有tag
git tag 或 git tag -l
2.添加tag git tag 标签名
git tag v1.0 会在当前commit打上名为“v1.0”的标签;
git tag v1.1 3a11706f8 会在commit id为 3a11706f8的那次提交打上“v1.1"的标签,即可以指定commit id来打标签
git tag -a v1.0 -m "relase v1.0" ,-a指定标签名,-m指定说明文字
git tag -a v1.1 -m "relase v1.1" 3a11706f8 也是可以得。
以上四种是添加tag的所有方法,另外,我发现可以同一次commit提交打多个tag。
3.删除tag git tag -d 标签名
git tag -d v1.0
4.将本地的tag推到远程
git push origin v1.0 仅将v1.0的标签推到远程
git push origin --tags 将所有未推送的标签都推到远程
5.删除远程tag
step1: 删除本地tag git tag -d v1.0
step2:git push origin :refs/tags/v1.0
6.查看标签信息
git show 标签名
git show v1.0
在File–>Setting->Version Control–>Git–>Path to Git executable选择你的git安装后的git.exe文件,然后点击Test,测试是否设置成功
5.1 下载ignore插件
idea-gitignore-2.3.0-互联网文档类资源-CSDN下载
去这个网址下载好压缩包,选择Install plugin from disk。。
也就是你不想上传到git上东西,比如.idea .im文件
在git账户上建立一个你要上传项目的git名称,比如flume_kafka_channel,git上会生成一个项目的地址或者叫路径,这个在IDEA上传项目的时候会用。
按照下图的方式创建本地仓库
将项目导入到本地仓库
点击Remotes,会弹出一个窗口,把你刚才Git上项目的git地址,添加进去
生存密钥
输入指令:ssh-keygen -t rsa -C "邮箱",提示输入保存密钥路径,直接回车即可(三次默认回车)。
注:后面是自己的前面设置的邮箱($ git config --global user.email [email protected])
然后出现下图所示的图案,表示密钥生成完毕,并且会生成2个文件:id_rsa和id_rsa.pub。
最后找到id_rsa.pub文件,粘贴里面全部的内容,找到git服务器的个人账户设置,点击添加sshKeys,添加key,key的内容为你粘贴的全部信息。
到此通过IDEA将一个项目上传到git上完成。
拉取项目是 直接点击new file 然后选择from version control
会调出如下的界面 在URL填写你要拉取项目的git地址即可
注意:多人进行项目开发时,需要先拉取才能进行提交更新。