Git

目录

1.总览

2.GIt基础

3.Git在idea上的使用

 

1.总览

任何时候都能通过如下命令

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  查看文件的情况 查看文件未添加还是未提交

三种状态

  1. 所有文件都提交了 nothing to commit ,working tree clean

  2. 红色 说明有文件没有被添加

  3. 绿色 说明文件被添加了没有被提交

撤销修改
git checkout +被撤销的文件名字 
连接码云
  1. 有码云账户

  2. 在电脑中生成公钥和秘钥

    桌面打开git 命令行 执行生成命令

    ssh-keygen -t rsa -C "xxxxx@xxxxx.com"  

    执行命令 一直回车

    打开用户文件夹可以看到秘钥文件夹 user/.ssh下id_rsa.pub为公钥

  3. 在码云账户中配置SSH公钥

(从云端克隆和推送到云端)

码云的基本使用

  1. 创建仓库

  2. 将仓库下载本地 克隆

    在要保存的文件夹内打开git,输入

    git clone +码云仓库地址。这样就完成了下载克隆
  3. 本地写代码

  4. 推送到仓库上

    1. 文件提交到本地仓库 add commit

    2. 将本地仓库推送到码云 git push 推送

  5. 更新本地项目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),重启项目。再次提交会让输入账户和密码

原文地址:https://www.cnblogs.com/lvhouhou/p/11540989.html