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 的使用及出现的问题的主要内容,如果未能解决你的问题,请参考以下文章

Git

如何管理在每个 git 版本中添加私有代码片段?

VSCode自定义代码片段——git命令操作一个完整流程

码农的好助手:版本管理工具git的使用

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程