赞
踩
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
Git 与 SVN 区别点:
一般工作流程如下:
我们先来理解下 Git 工作区、暂存区和版本库概念:
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
这是必须要做的事情,否则git的提交将会发生错误
注意,此处设置的用户签名和Github上的信息没有直接的关系
替换xxx和yyy为你自己的信息即可
git config --global user.name xxx
git config --global user.email yyy@qq.com
另外,我们可以使用如下命令提高命令输出的可读性:
这样一来,各种命令的输出就会变得更容易分辨
git config --global color.ui auto
配置完成后,还可以查看配置信息进行检查:
git config --global --list
Git 使用 git init
命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init
是使用 Git 的第一个命令。
在执行完成 git init
命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
git init
git status
如果是初始化的库,将会显示如下信息:
On branch master # 当前在master分支
No commits yet # 没有文件待提交
nothing to commit (create/copy files and use "git add" to track)
如果您新建了新的提交文件,比如hello.txt
,再次执行查看本地库状态的命令,将会收到如下的信息:
On branch master
No commits yet
Untracked files: # 存在新的未被追踪的文件,hello.txt
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
git add .
add命令支持通配符操作:
git add * # 添加所有文件
git add *.txt # 添加所有txt类型的文件
执行完add操作后,再次查看本地库状态:
On branch master
No commits yet
Changes to be committed: # 新的文件已经暂存到暂存区
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
如果您想删除暂存区的某个文件,可以使用如下命令:(此操作不会将本地的文件删除,只会删除暂存区里的文件)
git rm --cached hello.txt
提交暂存区的所有文件到本地仓库,如下语句携带一个-m
参数,这个参数后面是本次提交的提示信息,您需要根据本次提交的信息进行自定义
git commit -m "init project"
一个好的 Git 提交消息如下:
标题行:用这一行来描述和解释你的这次提交
主体部分可以是很少的几行,来加入更多的细节来解释提交,最好是能给出一些相关的背景或者解释这个提交能修复和解决什么问题。
主体部分当然也可以有几段,但是一定要注意换行和句子不要太长。因为这样在使用 "git log" 的时候会有缩进比较好看。
提交完成后,如果提交成功,将会输出本次提交的版本号:
[master (root-commit) 949d76f]
此外,我们还可以查看本地库的所有版本信息:
git reflog
查看详细版本历史提交信息:
git log
可以添加一些参数来查看自己希望看到的内容:
git log --author=bob # 只看bob的提交记录
修改提交信息:
要修改上一条提交信息,可以使用git commit --amend
命令
dahe@Dahe-Windows MINGW64 /d/SysData/mine/桌面/gittest (dahe)
$ git reflog
1828edb (HEAD -> dahe) HEAD@{0}: commit: 新增txt测试文
件
625efb9 (origin/main, origin/HEAD, main) HEAD@{1}: checkout: moving from main to dahe
625efb9 (origin/main, origin/HEAD, main) HEAD@{2}: clone: from github.com:dahezhiquan/gittest.git
dahe@Dahe-Windows MINGW64 /d/SysData/mine/桌面/gittest (dahe)
$ git commit --amend
[dahe 832f438] dahe新增txt测试文件
Date: Sat Oct 8 16:17:48 2022 +0800
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
dahe@Dahe-Windows MINGW64 /d/SysData/mine/桌面/gittest (dahe)
$ git reflog
832f438 (HEAD -> dahe) HEAD@{0}: commit (amend): dahe新增txt测试文件
1828edb HEAD@{1}: commit: 新增txt测试文件
625efb9 (origin/main, origin/HEAD, main) HEAD@{2}: checkout: moving from main to dahe
625efb9 (origin/main, origin/HEAD, main) HEAD@{3}: clone: from github.com:dahezhiquan/gittest.git
git支持在不同的版本之间进行穿梭
当您回退到其他版本时,本地的代码也会发生相应的变化
git reset --hard 0712165(版本号)
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
Git 分支实际上是指向更改快照的指针。
有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
当前所在的分支,由绿色标识:
git branch -v
git branch <branch-name>
git checkout <branch-name>
创建并切换分支:
dahe@Dahe-Windows MINGW64 /d/SysData/mine/桌面/gittest (main)
$ git checkout -b dahe
Switched to a new branch 'dahe'
dahe@Dahe-Windows MINGW64 /d/SysData/mine/桌面/gittest (dahe)
$ git branch
* dahe
main
切换到某一分支后,将在某一分支进行工作,不同分支之间互不影响,如果原分支和切换后的分支文件内容不一致,那么git会进行同步修改操作!
将指定的分支合并到当前分支上
例如当前分支是master,执行:
git merge hot-fix
这将会把hot-fix分支上的内容合并到master分支上,也就是文件内容会做同步更改
git 冲突出现的场景很多,git rebase
,git pull
,git merge
,git cherry-pick
, 等命令都有可能出现冲突,其实他们的本质是相同的。
两个分支各自都有新的提交,且都对代码同一行进行了修改,现在想将两个分支进行合并,就发生冲突了。
文字有点绕,看看下图:
我和同事都拿到一份提交历史为 a,b 的代码,我们两个都对同一部分代码进行修改并提交,分别为 c 和 d。
现在要将两个提交进行合并,git 不知道应该采用哪个修改,于是就提示冲突,让我们人为进行修改。
假设我们合并分支的时候两个分支的同一个文件的同一个位置(hello.txt)被修改,那么Git会出现如下的错误信息:
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
意思是Git也无法确定要保留那个修改,此时需要手动解决冲突
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。