作者:小 琛
欢迎转载,请标明出处
文章目录
git是什么?
理解“版本”的概念
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。结合我们日常生活中的内容,每个产品都有它的版本,各个版本间或多或少存在差异。而对于开发者而言,版本的更换就等于我们对代码的修改
例如:
如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能),采用版本控制系统(VCS)是个明智的选择。 有了它你就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
git对于开发者的意义
个人的理解是:git像是一个连锁的仓库,当你将代码交给它管理后,它通过记录快照的方式存储,当你对某些内容进行修改后,git通过描述的方式记录本次修改,并将修改后的内容存放。此外,该仓库通过网络实现连锁功能,本地仓库可以通过克隆的方式拉取内容,亦可以通过推送的方式将已经完成的工作与主体进行合入
git的几大特征
- 直接记录快照,而非差异比较
- 近乎所有操作都是本地执行
- Git 保证完整性
- Git 一般只添加数据
git的安装
在 Linux 上安装
如果你想在 Linux 上用二进制安装程序来安装基本的 Git 工具,可以使用发行版包含的基础软件包管理工具来安装。 以 Fedora 为例,如果你在使用它(或与之紧密相关的基于 RPM 的发行版,如 RHEL 或 CentOS),你可以使用 dnf:
$ sudo dnf install git-all
如果你在基于 Debian 的发行版上,如 Ubuntu,请使用 apt:
$ sudo apt install git-all
要了解更多选择,Git 官方网站上有在各种 Unix 发行版的系统上安装步骤,网址为
https://git-scm.com/download/linux。
Mac下安装
在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 git 命令即可。
$ git --version
如果没有安装过命令行开发者工具,将会提示你安装。
如果你想安装更新的版本,可以使用二进制安装程序。 官方维护的 macOS Git 安装程序可以在 Git 官方网站下载,网址为
https://git-scm.com/download/mac。
Git macOS 安装程序。
Figure 7. Git macOS Installer.
你也可以将它作为 GitHub for macOS 的一部分来安装。 它们的图形化 Git 工具有一个安装命令行工具的选项。 你可以从 GitHub for macOS 网站下载该工具,网址为
https://mac.github.com。
Windows下安装
在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win,下载会自动开始。 要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 http://msysgit.github.io/。
要进行自动安装,你可以使用 Git Chocolatey 包。 注意 Chocolatey 包是由社区维护的。
另一个简单的方法是安装 GitHub Desktop。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的换行设置。 稍后我们会对这方面有更多了解,现在只要一句话就够了,这些都是你所需要的。 你可以在 GitHub for Windows 网站下载,网址为 GitHub Desktop 网站。
git的基本操作
git clone
克隆现有的仓库到本地
$ git clone https://github.com/libgit2/libgit2
git status
检查当前文件的状态
$ git status
On branch master
Your branch is up-to-date with ‘origin/master’.
nothing to commit, working directory clean
git status -s
git status -s 命令到一种格式更为紧凑的输出。
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
git diff
查看尚未暂存的文件更新了哪些部分
一次提交过程
- git add
使用命令 git add 开始跟踪一个文件 - git commit
将缓冲区内容提交到本地
git commit -m “bugfix”
git commit -a
给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
- git push
将本地内容推送至当前所在的分支(仓库) - git rm
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交 - git log
查看提交历史
查看、设置用户名
git config --global user.name " "
一个重要的操作:撤销操作
在任何一个阶段,都有可能想要撤消某些操作。
- 提交的文件有遗漏
适用场景:提交文件有遗漏
$ git commit --amend
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。
$ git commit -m ‘initial commit’
$ git add forgotten_file
$ git commit --amend
- 取消暂存的文件
使用场景:暂存文件中有某个文件不希望作为暂存
git reset HEAD CONTRIBUTING.md
将该文件从暂存区拿出
- 撤消对文件的修改
使用场景:将修改的文件恢复
这个命令会令当前所做工作丢失,需谨慎使用
$ git checkout – CONTRIBUTING.md
将该文加恢复
- 回退到之前的某个版本
使用场景:当下的工作已经完全无意义,需要回退到之前的版本
git reset 版本号
通常先使用git log查看提交信息,拿到对应的版本id
- 撤销暂存区的文件
git rm --cached删除暂存区文件
远程仓库的含义
远程仓库是指托管在因特网或其他网络中的你的项目的版本库
- 查看远程仓库
git remote 命令
它会列出你指定的每一个远程服务器的简写
你也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
- 添加远程仓库
一般情况下,我们使用git clone命令,它会自动添加远程仓库到本地
git remote add pb https://github.com/paulboone/ticgit
这种方法亦可,不过不常用
- 从远程仓库中抓取与拉取
$ git fetch
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
- 推送到远程仓库
$ git push origin master
需要有权限;且需要本地内容为仓库最新版;
分支的使用
个人对分支的理解:
分支是开发中常用的手段,它保障主线(master)正常。就像是一件艺术品,多人对它进行雕琢,为了避免最终产物被破坏,实际开发人员会拉取一个与maser相同的分支,在这个分支上去做自己的开发,当开发完成并通过测试后,将分支合入master。
同时,分支的使用可以清楚的区分工作内容,例如:手中现有两个待解决的问题,可以拉取两个分支,每个分支处理一个问题。
- 新建分支
$ git branch iss53
- 切换分支
git checkout iss53
常用:新建分支并切换至该分支
git checkout -b iss53
- 合并分支
场景:在某个分支上的开发工作已经完成,我们需要将分支和并至master。
$ git checkout master
Switched to branch ‘master’
$ git merge iss53
Merge made by the ‘recursive’ strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
- git pull
相当于git fetch + git merge操作
- git push
$ git push origin serverfix
推送至该分支
使用变基完成冲突分支的合并
- git fetch origin 同步远程分支信息
- git rebase 目标分支
- 出现冲突,则会rebase失败,git会将冲突部分给出,本地手动解决冲突
- git add . +git reabse continue 即将修改冲突后的文件添加并继续变基
- git push -f 待合并的分支: 强推到自己分支,会让commit数目减少并完成变基合并
删除远程分支的某些文件
git rm --cached 文件名 :删除本地
git commit 完成提交
git push orgin 远程分支
使用submoudule实现分支依赖
使用场景:当前仓库的开发需要用到其它仓库的内容,例如:需要静态编译一个Qt的程序,为了保证所有人在拉去仓库后的都能编译,使用submoudule将QT静态编译需要的文件一同clone
创建
- clone自己的分支,在自己分支下:git submodule add http/ssh path
其中,http/ssh代表目标分支的url或ssh方式,path为所依赖分支的存放位置 - 接着git add . ; git commit ; git push远程仓库就有了该依赖库
- 其它用户使用时,首先拉去主仓库,之后git submodule init && git submodule update
解决冲突的方法
变基法
- git fetch origin
- git rebase 目标分支
- 本地解决冲突
- git add + git rebase --continue
- git push