本地git版本控制简单范例
试验环境:E:\测试代码\github\Demo 版本控制对象:test.txt
1. 创建或获取git仓库
a. 创建一个仓库
在当前路径E:\测试代码\github\Demo下右键点击 Git Base Here 会弹出一个命令行,如下
指令初始化仓库
git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的Git仓库中所有的必须文件,这些文件时Git仓库的骨干。但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
b. 获取(克隆)现有的仓库
如果你想获得一份已经存在了的Git仓库的拷贝,这时就需要用到克隆指令
指令克隆仓库
git clone <url>
如果你想克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:
git clone <url> <newname>
我克隆了我自己的一个线上库到本地命名为:djc
2. 将内容更新到仓库中
现在本地路径中有了一个Git仓库,可能是初始化的,也可能是克隆的。 从简单的入手,我们选择初始化仓库。 有了仓库,也一定有对应需要被存储的文件。 于是我在当前路径下新建了一个test.txt,作为我们本次版本控制的对象。
a. 检查文件状态
新建之后,我们可以检查一下该文件目前在仓库中处于什么样的状态。
指令检查文件状态
git status
如果当前目录下出现处于未跟踪状态的新文件,那么这条指令就会将他们都列举出来。test.txt就属于未跟踪的新文件!
test.txt已经在Untracked files中被标红,说明仓库目前并没有对其进行跟踪。
b. 跟踪新文件
未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围,除非你明明白白告诉他“我需要跟踪该文件”。而test.txt确实是我们需要跟踪管理的。
指令跟踪新文件
git add test.txt
运行结束之后也没有什么特殊的提示,如果我们此时再运行git status
我们会看到test.txt文件已经被跟踪,并处于暂存状态。 如果目录下文件很多,无法逐个进行跟踪。
可执行统一跟踪指令
git add -A
当前目录下所有文件都会被仓库跟踪,处于暂存状态
c. 暂存已修改的文件
如果此时我们对test.txt中的内容进行修改,再重新git status一下 我们会发现又出了一些问题,test.txt即处于暂存状态,又处于未跟踪状态。
因为test.txt修改前的内容,仓库进行了暂存跟踪。而修改后的内容,仓库并没有进行跟踪。所以会出现处于两种状态的情况。要解决这个问题就再执行一次跟踪指令。
d. 忽略文件
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。例如:日志文件、临时文件等。在这种情况下,我们可以创建一个名为 .gitignore的文件,列出要忽略的文件的模式。 首先我们先在路径下创建一个文件,名为.gitignore 用记事本打开该文件后输入:
*.[oa] // 忽略所有以.o或.a结尾的文件
*~ // 忽略所有名字以波浪符结尾的文件
*.log // 忽略所有后缀为.log的文件
完毕执行指令
忽略文件指令
cat .gitignore
返回结果:
e. 查看已暂存和未暂存的修改
git status或许显示的信息太过于简洁,想知道具体哪些地方产生了修改,我们可以使用其他命令来查询。
查询修改内容指令
git diff
我们先对test.txt的文本进行一些修改,但不执行git add命令,直接使用git diff。
如图看到指令返回红色那行是产生修改行,具体修改了哪些内容已经由绿色字体标出。
请注意!git diff本身只是显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。所以有时候你一下子暂存了所有更新过的文件,运行git diff后却什么也没有,可能是这个原因。
f. 提交确认暂存区所有修改
前面章节我们使用 git add 命令将内容写入暂存区。现在,我们要将暂存区内容中的所有修改添加到本地仓库中。
提交命令
git commit -m [commit content]
先将刚刚在git diff时的修改暂存,git add 然后执行git commit
在此处有个问题需要注意,commit提交的是暂存区的内容,也就是执行过add指令的内容。如果在执行add指令之后有些文件又发生了变化,并直接执行commit,那么add之后修改的内容将不会保存到仓库中!
3. 分支管理
使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。在提交操作时,Git会保存一个提交对象,该对象包含一个指向暂存内容的快照指针。在仓库初始化时,默认就由一个分支master。 我们到此将目前的所有内容commit一下
当前也只有test.txt一个文件
在test.txt文件中
12312313
ASDFASDF
12sadfsadf
asdfkjaskdfjk
asdfaksldfjkl
askdfjkalsdfassdf
aksdjflasdf
QWERERasd
this is the second amend!
这是目前仓库指针情况,5bd104e代表本次commit的版本
a.分支创建
现在我们将在此基础上创建一个新的分支testbranch
创建分支指令
git branch [branchname]
创建一个可以移动的名为testbranch的新指针。
此时仓库指针情况如下:
master
5bd104e
HEAD
testbranch
b.分支切换
切换到一个已存在的分支testbranch
切换分支指令
git checkout [branchname]
此时仓库指针情况如下:
master
5bd104e
HEAD
testbranch
c.分支切换会改变工作目录
现在我们两个分支都指向了同一个commit版本。 我们将现有内容略作修改,新建一个新的test1.txt并重新commit一次。
此时的仓库分支情况:
master
5bd104e
e8b758f
HEAD
testbranch
此时master指针还在第一次commit的版本上,而testbranch指针指向了新的commit版本。 如果我们重新切换回master版本
刚刚新建的test1.txt文件不见了!
如果我们再重新切换回testbranch分支:
test1.txt文件又回来了!
由此可见,分支切换会改变你工作目录中的文件!
现在,这个项目的提交历史已经产生了分叉。因为刚才你创建了一个新的分支,并切换过去进行了一些工作。上次改动针对的是不同的分支,你可以在不同的分支间不断地来回切换工作,并在时机成熟的时候将他们合并起来。
d.分支合并
我们一般认为master分支指向的都是稳定版本,也可以认为master是主线。在项目不成熟前的所有修改调试都在分支上。此时我们的master是主线,testbranch是分支。在testbranch上我们也做了一些修改,新建了一个test1.txt文件。
有这样一个场景,此时主线项目(master)在运行时出了个BUG, 为此我们不得不放下当前testbranch的修改。去master处理bug。于是我们在testbranch上重新commit一下保存我们之前修改,回到master上去处理。
- 对testbranch存盘
master
5bd104e
e8b758f
b82422a
HEAD
testbranch
- 切换回master分支
master
5bd104e
e8b758f
b82422a
HEAD
testbranch
- 处理test.txt中的Bug
我用一行文字代替了bug的位置,然后用diff查看了一下修改内容。
确认,再commit一下。
此时仓库的分支情况:
master
a0b13e5
5bd104e
e8b758f
b82422a
HEAD
testbranch
现在a0b13e5(bug修改)与b82422a(testbranch修改)已经出现了分叉。假设你已经修正了bug问题,并且打算在testbranch分支中拉取bug所做的修改,你可以将master分支合并入testbranch分支,或者你也可以等到testbranch分支完成其使命,再将其合并进入master分支。
分支合并指令
git checkout [mergedbranch]
git merge [maergebranch]
我们现在选择将master合并进入testbranch
这样就可以在修改bug的情况下,继续完成testbranch上的任务
e.分支删除
在当前分支与别的分支完成合并之后,就可以将其删除。 如果此时testbranch分支已经完成它的使命。就可以将其与主线(master)合并。然后将其删除。
分支删除指令
git branch -d [deletebranchname]
|