Git 是一个分布式版本控制系统,用于项目开发中的版本控制。从本质上来讲Git是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。
Git的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。Git管理的项目工作目录下的每一个文件只有这两种状态:已跟踪或未跟踪。
-
已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
-
工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。
-
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,Git会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。不仅如此,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。
Git将项目的存储分为4部分,每部分有自己作用,见下图所示:
0.创建Git仓库
$git init # 命令用于在目录中创建新的 Git 仓库。
在目录中执行 git init 就可以创建一个 Git 仓库了。
例如我们在当前目录下创建一个名为 runoob 的项目:
$ mkdir runoob
$ cd runoob/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 初始化空 Git 仓库完毕。
# 现在你可以看到在你的项目中生成了 .git 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。
1.配置用户名
要在此计算机开始使用Git,必须输入已经认证的用户名。用户名和电子邮件地址应与你在GitLab中使用的一致。
# 1.In your shell, add your user name:
$ git config --global user.name "your_username"
# 2.Add your email address:
$ git config --global user.email "your_email_address@example.com"
# 3.我们要求 Git 版本 1.9.5 以上,这一条设置的 push 方式,只是建议,一般可不设置
$ git config --global push.default simple
# 4.让Git不要管Windows/Unix换行符转换的事
$ git config --global core.autocrlf false
# 5.设置大小写敏感
$ git config --global core.ignorecase false
# 6. To check the configuration, run:
$ git config --global --list
# --global选项告诉Git,无论您在系统上做什么,都要始终使用这些信息。
# 如果省略--global或use--local,则配置仅适用于当前存储库 current repository
2.建立连接(credential)
配置SSH KEY
配置SSH Key主要是为了允许您的计算机和Code代码平台之间建立安全连接。
启动的Git中输入如下命令来生成ssh key:
$ ssh-keygen -t rsa -C "电子邮箱地址"
这个指令会要求你提供一个位置和文件名去存放键值对和密码,你可以点击Enter键去使用默认值。
用以下命令获取你生成的公钥
$ cat ~/.ssh/id_rsa.pub
复制这个公钥放到你的个人设置中的SSH Keys下,请完整拷贝从ssh-开始直到你的用户名和主机名为止的内容。
如果打算拷贝你的公钥到你的粘贴板下,请参考你的操作系统使用以下的命令:
$ clip < ~/.ssh/id_rsa.pub # windows
打开Code平台SSH KEY设置页面,直接将公钥粘贴到输入框中
3. 克隆代码
# 默认克隆项目的主分支,其他分支并没有被克隆到本地
$ git clone https://gitlab.com/gitlab-tests/sample-project.git
4. 查看分支
$ git branch #查看本地分支
$ git branch -r #查看远程分支
$ git branch -a #查看所有分支
$ git branch -vv #查看本地分支及追踪的分支
5. 创建分支
$ git branch newbranch #创建本地分支newbranch
$ git checkout -b newbranch #创建并切换到新的分支.
这个命令是将git branch newbranch和git checkout newbranch合在一起的结果。
#将本地分支push, 就创建了远程分支
#创建本地分支(远程分支对应的分支)并切换到新建的本地分支
$ git checkout -b 本地分支名 origin/远程分支名
# checkout远程的dev分支,本地创建名为dev分支,并切换到本地的dev分支
$ git checkout -b dev origin/dev #(举例)
# 1.先拉取一个指定仓库中主分支到本地同名分支
$ git clone git@github.com:geometryolife/gld.git
# 进入项目的根目录
cd gld
# 默认克隆项目的主分支,其他分支并没有被克隆到本地
# 2.现在想再次拉取一个分支emm
$ git branch -a #查看所有分支
# 3. 拉取另外一个分支到本地,同时切换到emm 分支
$ git checkout -b emm origin/emm
# 再次查看,emm 分支已经被拉取下来了,同时也切换到了 emm 分支
git branch -a
6. 切换分支
#切换本地分支
$ git checkout branchname
# 切换远程分支
# 该命令可以将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来。
# 并切换到新建的本地分支中。
$ git checkout -b dev origin/dev
# 放弃所有工作区的修改
$ git status # 比如查看工作区有两个被修改的文件
$ git checkout . # 执行了命令后,放弃了所有的工作区的修改
# 放弃对指定文件的修改, 从缓存区里拉取的版本【不是工作区】还原本地无意修改的版本
$ git checkout –- filename
# 放弃工作区和暂存区的所有修改
$ git checkout -f
7.删除分支
$ git branch -d branchName #删除本地分支 branchName
$ git push origin --delete branchName #删除远程分支 branchName
8.合并分支
#合并前要先切回要并入的分支,以下表示要把dev分支合并入master分支
$ git checkout master #切换到master分支
$ git merge dev #将dev合并到master分支
9.提交换行注释
#注释可以通过单引号来换行
$ git commit -m '
> 1.aaaaa
> 2.bbbb
'
$ git merge dev #将dev合并到master分支
$ git commit --amend #查看到刚刚的log信息为
10.添加和提交代码
#第一步:查看当前的git仓库状态
$ git status
#第二步:更新全部,你可以提出更改(把它们添加到暂存区)
$ git add *
#第三步:添加注释,使用如下命令以实际提交改动
# 你的改动已经提交到了 HEAD,但是还没到你的远端仓库。
$ git commit -m "更新说明"
#第四步:先git pull --rebase,拉取当前分支最新代码
# 建议使用rebase操作会更好一点,这样可以线性的看到每一次提交,并且没有增加提交节点。
# 不加--rebase 特定情况下会出现冲突
$ git pull --rebase
#第五步:push到远程master分支上,执行如下命令以将这些改动提交到远端仓库:
git push origin master
#git push origin master的意思就是上传本地当前分支代码到远程master分支。
#git push 是上传本地所有分支代码到远程对应的分支上
# 关于提交的其它说明
git push -u origin master #如远程仓库为空需加上-u这个参数
git push origin master
加了参数-u后,以后即可直接用git push代替git push origin master
意思就是我们不用在后面加 origin + 要提交的分支名 ,直接 git push 即可
但是前提是第一次提交需要加 -u参数后, 后面的提交就直接可以 git push
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:
git push --force origin master
- git pull = git fetch + git merge FETCH_HEAD # merge 多用户提交时可能会导致冲突
- git pull --rebase = git fetch + git rebase FETCH_HEAD #无冲突的问题
- git add . 会把本地所有untrack的文件都加入暂存区,并且会根据.gitignore做过滤,
- 但是git add * 会忽略.gitignore把任何文件都加入
11.查看log
$ git log #查看提交历史记录
$ git log --oneline #以精简模式显示
$ git log --pretty=oneline #以精简模式显示,即一个压缩后的每一条提交记录只占一行的输出
$ git log --author=bob #只看某一个人bob的提交记录
$ git log --name-status # 看看哪些文件改变了
$ git log --help #log更多的信息
12.撤销操作
$ git status #查看add 中的文件
$ git reset HEAD #默认是上一次add 里面的全部撤销了
$ git reset HEAD XXX.js #对某个文件进行撤销了
13.查看remote地址,远程分支,还有本地分支与之对应的关系等信息
$ git remote show origin
14.在本地删除远程不存在的分支
$ git remote prune origin
15.其它
#查看已安装的git版本
$ git --version
# 要查看本地未提交的更改与已拉取的最新版本之间的差异,比如手动更改了拉取的代码,但未提交更新
$ git diff
# 替换本地改动,
# 假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动
$ git checkout -- <filename>
# 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。
# 已添加到暂存区的改动以及新文件都不会受到影响。
# 假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
$ git fetch origin #获取远程服务器的最新历史版本
$ git reset --hard origin/master # 本地分支指向它
# 如果想要删除仓库某个文件夹
# 第1步:先pull远程代码,保持同步
$ git pull --rebase
# 第2步:删除单个文件或文件夹
$ git rm 文件名 --cached #删除文件
$ git rm -r 文件夹名 --cached # 删除文件夹
# 第3步:提交修改
$ git commit -m "备注信息"
# 第4步:推送
git push origin master
16.异常提交处理
git 执行git pull –rebase报错误如下:
error: Cannot pull with rebase: You have unstaged changes.
error: Additionally, your index contains uncommitted changes.
原因:如果有未提交的更改,是不能git pull的
解决:
先执行 git stash
再执行 git pull --rebase
最后再执行 git stash pop
参考资料
git 官方文档
git 中文文档