Git 的使用
Posted catoop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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 key's 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
进行添加然后提交。
其他资料参考:
http://m.blog.csdn.net/article/details?id=51880064
(END)
以上是关于Git 的使用的主要内容,如果未能解决你的问题,请参考以下文章