Git 的使用及出现的问题
Posted WCK的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 的使用及出现的问题相关的知识,希望对你有一定的参考价值。
一、初始化Git
在自己方便的盘中新建一个文件夹,这里以Project为例,注意路径中不要含有中文字符。打开cmd命令窗口,操作如下:
#初始状态在切换到项目目录
cd Project
#初始化Git项目,成功后创建有一个.git隐藏文件
<Project> git init
Initialized empty Git repository in Project/.git/
#在文件夹Project中添加一个文本文件README,md格式指Markdown格式(建议使用Notepad++编辑)
#然后输入以下命令将文件加入暂存区
<Project> git add README.md
#将文件提交到git仓库(-m表示添加本次提交的说明,强制要求写的)
<Project> git commit -m "add a readme file"
[master (root-commit) 9e08cf4] add a readme file
1 file changed, 1 insertion(+)
create mode 100644 README.md
git clone 我们使用 git clone 从现有 Git 仓库中拷贝项目
git clone git远程仓库地址 本地文件夹
二、Git 提交—状态
<Project> git status
On branch master
nothing to commit, working tree clean
On branch master: 我们位于一个叫做“master”的分支里,这是默认的分支
nothing to commit, working directory clean : 说明你的工作目录目前是“干净的”,没有需要提交的文件(意思就是自上次提交后,工作目录中的内容压根儿就没改动过)。
输入git status命令,提示如下:
<Project> git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE(红色)
nothing added to commit but untracked files present (use "git add" to track)
Untracked files 说明存在未跟踪的文件(下边红色的那个)
所谓的“未跟踪”文件,是指那些新添加的并且未被加入到暂存区域或提交的文件。它们处于一个逍遥法外的状态,但你一旦将它们加入暂存区域或提交到 Git 仓库,它们就开始受到 Git 的“跟踪”。
(use "git add" to track)
这里圆括号中的英文是 git 给我们的建议:使用 git add 命令将待提交的文件添加到暂存区域。
<Project> git add LICENSE
<Project> git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE(绿色)
use "git reset HEAD <file>..." to unstage
的意思是“如果你反悔了,你可以使用 git reset HEAD
命令恢复暂存区域”。如果后面接文件名,表示恢复该文件;如果不接文件名,则表示上一次添加的文件。
<Project> git reset HEAD
<Project> git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE(红色)
nothing added to commit but untracked files present (use "git add" to track)
再次添加到暂存区域,然后执行 git commit -m "add a license file"
命令:
<Project> git add LICENSE
<Project> git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
<Project> git commit -m "add a license file"
[master 9fdf9f4] add a license file
1 file changed, 7 insertions(+)
create mode 100644 LICENSE
<Project> git status
On branch master
nothing to commit, working tree clean
三、关于修改文件
突然发现版权那块忘了写上自己的名字了……
打开 LICENSE 文件,将 Copyright © 改为 Copyright © 2016 FishC,保存……
执行 git status 查看状态
<Project>git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: LICENSE(红色)
no changes added to commit (use "git add" and/or "git commit -a")
由于你对工作目录的文件进行了修改,导致这个文件和暂存区域的对应文件不匹配了,所以 Git 又给你提出两条建议:
使用 git add
命令将工作目录的新版本覆盖暂存区域的旧版本,然后准备提交
使用 git checkout
命令将暂存区域的旧版本覆盖工作目录的新版本(危险操作:相当于丢弃工作目录的修改)
还有一种情况我们没分析,大家先把新版本的文件覆盖掉暂存区域的旧版本:
<Project>git add LICENSE
<Project>git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: LICENSE(绿色)
然后我们打开 LICENSE 文件,将 FishC 改为 FishC.com,保存……
<Project>git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: LICENSE(绿色)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: LICENSE(红色)
这次情况是:被绿的 LICENSE 说明文件存放在暂存区域(待提交),同时红色的 LICENSE 说明文件还在工作目录等待添加到暂存区域。
这种情况你应该意识到这里存在两个不同版本的 LICENSE 文件,这时如果你直接执行 commit 命令,那么提交的是暂存区域的版本(FishC),如果你希望提交工作目录的新版本(FishC.com),那么你需要先执行 add 命令覆盖暂存区域,然后再提交……
从工作目录一步添加到仓库:git commit -am “说明”
<Project>git commit -am "change the license file"
-a的意思是add。
git log
查看历史操作记录
四、Git 回退的命令有两个:reset 和 checkout
先执行git log命令,将此时的Git仓库可视化
三棵树的情况:
回滚快照
注:快照即提交的版本,每个版本我们称之为一个快照。
现在我们利用 reset 命令回滚快照,并看看 Git 仓库和三棵树分别发生了什么。
执行 git reset HEAD~
命令:
注:HEAD 表示最新提交的快照,而 HEAD~ 表示 HEAD 的上一个快照,HEAD~~表示上上个快照,如果表示上10个快照,则可以用HEAD ~10
此时我们的快找回滚到了第二棵数(暂存区域)
第一次执行reset后Git仓库
第一次执行reset后三棵树
git reset HEAD~
命令其实是 git reset --mixed HEAD~
的缩写, --mixed
选项是默认的。
默认 git reset HEAD~ 命令其实影响了两棵树:首先是移动 HEAD
的指向,将其指向上一个快照(HEAD~);然后再将该位置的快照回滚到暂存区域。
–soft选项 git reset --soft HEAD~ 命令就相当于只移动 HEAD 的指向,但并不会将快照回滚到暂存区域。相当于撤消了上一次的提交(commit)。一不小心提交了,后悔了,那么你就执行 git reset
–soft HEAD~ 命令即可(此时执行 git log 命令,也不会再看到已经撤消了的那个提交)。
–hard选项 reset 不仅移动 HEAD 的指向,将快照回滚动到暂存区域,它还将暂存区域的文件还原到工作目录。
回滚指定快照
reset 不仅可以回滚指定快照,还可以回滚个别文件。
命令格式为: git reset
快照 文件名/路径
这样,它就会将忽略移动 HEAD 的指向这一步(因为你只是回滚快照的部分内容,并不是整个快照,所以 HEAD 的指向不应该发生改变),直接将指定快照的指定文件回滚到暂存区域。
不仅可以往回滚,还可以往前滚!
这里需要强调的是:reset 不仅是一个“复古”的命令,它不仅可以回到过去,还可以去到“未来”。
唯一的一个前提条件是:你需要知道指定快照的 ID 号。
那如果不小心把命令窗口关了不记得ID号怎么办?
命令:git reflog
Git记录的每一次操作的版本ID号
五、Git 创建和切换分支
分支是什么?
假设你的大项目已经上线了(有上百万人在使用),过了一段时间你突然觉得应该添加一些新的功能,但是为了保险起见,你肯定不能在当前项目上直接进行开发,这时候你就有创建分支的需要了。
对于其它版本控制系统而言,创建分支常常需要完全创建一个源代码目录的副本,项目越大,耗费的时间就越多;而 Git 由于每一个结点都已经是一个完整的项目,所以只需要创建多一个“指针”(像 master)指向分支开始的位置即可。
创建分支,使用 git branch 分支名 命令:
git branch dev
没有任何提示说明分支创建成功(一般也不会失败啦,除非创建了同名的分支会提醒你一下),此时可以执行 git log --decorate 命令查看:
git log --decorate
切换分支
现在我们需要将工作环境切换到新创建的分支(dev)上,使用的就是之前我们欲言又止的 checkout 命令。执行 git checkout dev 命令:
git checkout dev
六、Git 合并和删除分支
合并分支
当一个子分支的使命完结之后,它就应该回归到主分支中去。合并分支我们使用 merge 命令,执行 git merge dev
命令,将 dev
分支合并到 HEAD 所在的分支master
上:
首先要将分支切换到 master
上
git checkout master
然后查看分支状态是不是在 master上
git status
实在master分支的话执行
git merge dev
指将dev个分支合并到master上面。
如果 合并 文件的时候出现冲突。所以自动合并失败;请修改冲突的内容并重新提交快照。意思是说现在你需要先解决冲突的问题,Git 才能进行合并操作。所谓冲突,无非就是像两个分支中存在同名但内容却不同的文件,Git 不知道你要舍弃哪一个或保留哪一个,所以需要你自己来决定。
此时执行 git status 命令也会显示需要你解决的冲突:
的文件 根据提示的问题的文件查找
以“=======”为界,上到“<<<<<<< HEAD”的内容表示当前分支,下到“>>>>>>> feature”表示待合并的
feature 分支,之间的内容就是冲突的地方。现在我们将 README.md 统一修改(去掉 <<<<<<< HEAD 等内容) 保存文件,然后提交快照:
修改玩冲突后 git add 文件
git add .
git commit -m "注释"
执行 git log --decorate --all --graph --oneline 命令,可以看到此时的分支已经自动合并了:
git log --decorate --all --graph --oneline
删除分支
删除分支,使用 git branch -d 分支名 命令:
git branch -d 分支名
执行 git log --decorate --all --graph --oneline 命令:查看
git log --decorate --all --graph --oneline
七、Git拉去远程代码 git pull
git pull 命令用于从远程获取代码并合并本地的版本,(git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写)。
git pull origin "分支名字"
八、Git提交代码到远程仓库 git push 命令
git push 命用于从将本地的分支版本上传到远程并合并。
git push origin "分支名字"
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:
git push --force origin "分支名字"
以上是关于Git 的使用及出现的问题的主要内容,如果未能解决你的问题,请参考以下文章