Git 的使用

会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述Git 的使用相关的知识,希望能为你提供帮助。
Git 的四个区


Remote Repo (远程仓库)
Local History (本地仓库)
Local Staged (cache 或 index)
Local Working Directory (源文件工作区)

Git命令
以下所有命令,最后都可以指定具体文件,如果不指定文件,默认就是当前目录下的所有子目录和文件
命令

说明

git config -l

查看GIT全局配置信息

git config --global user.name “xzxiaoshan”

设置配置信息,例如该命令是设置配置 user.name 为 xzxiaoshan

git init

初始化仓库(会生成一个 .git 文件夹)

git clone

git clone https://github.com/xzxiaoshan/TestGit.git

git add Test.txt

添加文件Test.txt 从 working到staged区,如果是提交当前目录下所有文件使用 git add .

git commit -m ‘提交说明’

提交staged区文件到本地仓库(所有的文件如果要提交到本地仓库,必须要先进行 add 然后再进行 commit 操作)

git commit -a -m ‘提交说明’

增加 -a 参数直接提交本地文件(working)到本地仓库(history)

git log Test.txt

查看文件的日志信息(commit 的日志,add 不会有日志)

git log --pretty=oneline

以每条历史单行显示的方式输出

git push origin mybranch

把 mybranch分支推送到远程仓库

git status

查看文件状态,文件前有2个标志位,-s 参数为更简洁的输出结果。例如MM解释:第一个M表示staged和history有修改,第二个M表示working和staged有修改。所以对MM状态的文件进行commit后,再查看文件状态后就是“ M”,即“第一位空白和第二位M”。指定 -s 参数更简洁的查看结果,如: git status -s

git diff

查看文件working和staged的区别(指定查看某一个文件的区别使用 git diff Test.txt)

git diff --staged

查看文件staged和history的区别

git diff HEAD

查看文件working和history的区别

git diff [--staged,HEAD] --stat

查看文件行增减区别信息,在上面各种 git diff 命令后追加参数 --stat

git reset Test.txt

例如将文件 git add 从 workding 到 staged 后,使用该命令撤回到 add 之前的状态,相当于用 history 覆盖了 staged, (即文件状态“M ” 回退到 “ M”) 注意使用 reset 命令后我们再使用 git log 将查看不到所reset的版本号之后的版本,此时我们可以使用 git reflog 命令,该命令记录了所有版本变更记录,所以如果你reset版本后,发现reset错了,是可以通过 git reflog 找到正确的版本ID,重新 git reset 版本ID 进行操作

git reflog

查看总的引用变更记录

git reset --hard HEAD

使用 --hard 参数直接从版本库 history 中获取版本覆盖到工作区 working 中。版本可以使用 HEAD HEAD~N 或者具体的版本ID(查看版本ID参考 git log 命令)

git reset 语法

reset命令有两种用法:

git reset [-q] [commit] [--] < paths>

git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [< commit> ]

第一种用法是不会重置引用的,即不会修改master文件。只是用某一次提交的文件提交暂存区的文件

第二种用法不使用 则会重置引用,并且参数不同决定是否覆盖暂存区和工作区:

> --hard参数会执行途中1,2,3 全部动作,即暂存区,工作区全部用指定提交版本的目录树替换掉

> --soft 参数只执行1, 不进行暂存区和工作区的覆盖

> --mixed或不使用参数,执行1,2覆盖暂存区,但不覆盖工作区

git checkout Test.txt

将 staged 区的文件覆盖 working 的文件

git checkout HEAD Test.txt

将 history 区的(HEAD 指代最后一个版本)文件覆盖 working 的文件。如果要还原历史版本,先使用 git log 命令查看版本号后,然后再使用命令 git checkout 版本号ID Test.txt 恢复到本地

git checkout HEAD~1 Test.txt

HEAD~1 与 HEAD 的区别在于,~N 代表 HEAD 版本的前几个版本

git rm Test.txt

同步文件删除状态到 staged,且删除 working 中的文件,故在进行 git rm 后再进行 git commit,文件将彻底消失

git rm --cached Test.txt

同步文件删除状态到 staged,且保留 working 中的文件,故在进行 git rm --cached 后再进行 git commit,文件将从仓库删除,working 保留,即该文件脱离管理,相当于刚刚创建的文件。如果先进行 git rm --cached Test.txt 然后再进行 git reset Test.txt,结果将和没有做任何操作一样。

git mv Test.txt Test.md

修改文件名,其操作逻辑和 git rm 一样,同样支持 --cached 参数。 按下面A方法(git mv Test.txt Test.md)和B方法(git rm --cached Test.txt 然后 mv Test.txt Test.md 然后 git add Test.md)操作后的结果是一样的。结果说明 git 会智能判断当文件内容一致并且一个是删除一个是添加的情况下它会认为这是修改文件名。

git stash

将 working 的当前状态整个隐藏备份起来,并且使当前环境 working 的代码变为 history 的代码。

git stash list

查看 git stash 的结果

git stash pop

将 git stash 的整体取出来作为当前 working 环境的代码

git stash 应用场景

当前 working 代码已经改了很多,并且没有完成工作不能提交。此时有一个紧急的问题需要修复发布。那么就可以将正在进行时的代码 stash 起来,对紧急问题修复处理完成 commit 后,再使用 stash pop 取出开发中的代码。

git log

查看历史记录

git cat-file -p HEAD

查看最后一次提交的信息,HEAD 可以用 git log 看到的历史ID 代替,查看具体ID的信息,也可以查看 tree 、 parent 信息,只需要提供对应ID 即可,查看对象信息的命令语法不变

git branch

查看当前所有 branch,星号开头的为当前 working 的 branch

git branch -r

查看远程所有分支

git branch -a

查看本地和远程所有分支

git branch mybranch

创建一个 branch,其中 mybranch 为 branch 的名字,可以到 .git/refs/heads/ 目录中查看所有 branch

git checkout mybranch

切换到名为 mybranch 的 branch,可以查看 .git/HEAD 文件内容确定当前 working 是指向哪个 branch,注意这些命令要在 .git 文件夹的目录文件夹中执行

git checkout -b mybranch

这个命令是合并 git branch mybranch 和 git checkout mybranch 两个命令的写法

git branch -d mybranch

删除名为 mybranch 的 branch,使用 -D 替换 -d 参数变为强制删除

git push origin :mybranch

删除远程分支

git checkout mybranch origin/mybranch

如果远程分支有个 mybranch,而本地没有,你想把远程的 mybranch 分支迁到本地

git checkout -b develop origin/mybranch

把远程分支迁到本地顺便切换到该分支

git merge mybranch

合并分支内容到当前。例:1. 创建 mybranch 分支; 2. 切换到分支 mybranch 并对其中的文件进行修改、然后提交; 3. 切换回 master; 4. 执行 git merge mybranch 合并刚刚在 mybranch 编辑的内容到 master。注意当mybranch修改并且没有合并到 master 之前,使用命令 git branch mybranch 是无法删除 mybranch 的,当然我们merge 之后,就可以正常删除 mybranch 了

git remote -v

查看远程仓库信息

git remote rm originTest

删除仓库

git remote add origin https://xxx.git

本地仓库(origin为定义https远程仓库的名称)和远程仓库建立连接(一般用于本地新项目准备推送到远程github的初步操作)

git remote --set-url https://yyy.git

修改远程仓库URL

git fetch origin master

从远程获取最新版本到本地

git log -p master… origin/master

比较本地的仓库和远程仓库的区别

git merge origin/master

把远程下载下来的代码合并到本地(working),远程的和本地的合并

【Git 的使用】git fetch origin master:mybranch

意思是:从远程的origin仓库的master分支下载到本地并新建一个分支mybranch

git pull 和 git pull --rebase

前者是 git fetch + git merge,后者是 git fetch + git rebase,建议使用 fetch 后,先比较本地与远程的区别后,选择性的合并。尽量把 git fetch 和 git rebase 分两步执行,不建议直接使用 git pull

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

下面是一个辅助理解的图
Eclipse中的GIT插件使用
  • Team > Advanced > Untrack (对已经进入版本库的文件,使其脱离版本库)
  • Team > Advenced > Assume-Unchanged (假定该文件没有被修改。比如修改了仅限本地使用的 application.properties 配置文件,这样标记后仓库就会认为这个文件和远程仓库上的文件一致没有被修改,所以对该文件进行提交操作是没有效果的)
  • Team > Advenced > No Assume-Unchanged (取消 Assume-Unchanged 标记)
  • 提交需要经历:commit + push
使用GITHUB
  • 创建SSH KEY
Shanhy@Shanhy-PC MINGW64 /f/mypro ((df87ce9...))
$ ssh-keygen -t rsa -C "365384722@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Shanhy/.ssh/id_rsa):
Created directory /c/Users/Shanhy/.ssh.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Shanhy/.ssh/id_rsa.
Your public key has been saved in /c/Users/Shanhy/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EtdLfRlIFNnvw+S8JwnNDVkEHSxh9WGymV7dIvSzaCY 365384722@qq.com
The keys randomart image is:
+---[RSA 2048]----+
|o=O*Oo|
|. o+oB+B|
|. . o o+B=+|
|o . ..++=.|
|. S E ++*+ |
|.+. o=o|
|. .o|
|o..|
|..|
+----[SHA256]-----+

其中 c:/Users/Shanhy/.ssh/ 为生的的 key 的存放目录。
  • 在github官网登录账号后,setting页面里配置 ssh_keys
Key 的内容是 c:/Users/Shanhy/.ssh/id_rsa.pub 文件中的内容。
  • 将本地仓库发布到远程 github 仓库
    先将本地仓库与远程仓库建立连接
    git remote add origin https://github.com/xzxiaoshan/mypro.git
    然后推送代码到远程仓库
    git push -u origin master
    由于是第一次推送,而且推送的是master分支,所以使用参数“-u”将远程的master和本地的master关联。
我在使用码云的时候,准备使用命令??git pull origin master??拉取最新的代码时候,发生了如下错误:
fatal: refusing to merge unrelated histories

然后在stackoverflow上找了个资料解决了问题 http://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories
就是要在命令的后面追加???--allow-unrelated-histories???才可以。
这个问题在2.9.0之后的版本才出现的,以前的版本可以正常工作。所以最后我的命令是:
git pull origin master --allow-unrelated-histories

提交 .gitignore 文件
如果你使用 ???git add *???,该命令不是包含 点 开头的隐藏文件的,如果是一个新文件夹,里面有一个 .gitignore 文件,是不会被识别的。对于点开头的隐藏文件,这种情况你需要指定具体的文件名,例如使用 ??git add .gitignore?? 进行添加然后提交。
?
(END)



    推荐阅读