Git 首次安装配置:
查看已配置项信息: git config --list
1. 查看所有配置信息以及它们所在的文件位置:
git config --list --show-origin
2. 配置用户信息:
git config --global user.name "你的名字"
git config --global user.email 762374031@qq.com
–global 选项,即为全局配置属性命令,在每个git 项目中如果无指定则默认使用此配置。当你想使用自己指定的配置信息时可以在该文件目录下执行没有 --global 选项的命令。
3. 文本编辑器配置:
git config --global core.editor "完整 exe 文件路径"
Git 基础:
初始化一个 git 仓库(repository)
git init、git clone
开始或停止跟踪(track)文件
git add、 git rm
暂存(stage)、提交(commit)或更改
git commit
指定忽略的文件和文件模式
.gitignore
迅速简单的撤销错误操作
浏览项目版本历史
git log
不同提交(commits)之间的差异
git diff
向远程仓库推送(push)
git push
从远程仓库拉去(pull)
git pull
1. 获取 Git 仓库
-
将尚未进行版本控制的本地目录转换为 Git 仓库
-
进入到该仓库路径下执行
git init // 创建一个名为 .git 的子目录
-
指定所需文件进行跟踪
git add *.java git add HELP.md git commit -m 'initial project version' // -m 指定提交信息
-
指定远程仓库
git remote add <shortname> <url> // 例:git remote add origin https://github.com/libgit2/libgit2
-
-
从其他服务器 克隆 一个已经存在的 Git 仓库
clone:克隆是将远程服务器上的每一个文件的每一个版本都拉去下来
checkout:复制完成你工作所需要的文件
-
将远程服务器上的 Git 仓库 clone 到本地
git clone https://github.com/libgit2/libgit2 // Git code address
在当前目录下创建一个 libgit2 文件夹并在其内部创建 .git 文件夹,从远程仓库拉取下所有数据存放入 .git 文件夹,从 .git 文件夹中读取最新版本的文件的拷贝到 libgit2 文件夹。初次 clone 时,文件夹中的所有文件都属于已跟踪文件
-
clone 远程仓库到自定义存放目录下
git clone https://github.com/libgit2/libgit2 mylibgit
-
2. 记录每次更新到仓库
-
检查当前文件状态
git status
git status -s/–short:
状态简览,以简洁的方式查看更改
$ git status -s M README // 修改过的文件 MM Rakefile // 同时存在于暂存区和工作区的文件 A lib/git.rb // 新添加到暂存区的文件 M lib/simplegit.rb ?? LICENSE.txt // 未跟踪文件
-
跟踪新文件,或者把已跟踪的文件放到暂存区
git add filename
git add :
- 添加跟踪新文件
- 将已跟踪的新修改文件存放到暂存区
- 合并时把有冲突的文件标记为已解决状态
-
忽略文件
vi .gitignore
.gitignore 所使用的 glob 模式正则表达式语法:
*:匹配任意多个字符串
[abc]:匹配任何一个列在方括号中的字符
?:只匹配一个任意字符
[0-9]:
**:匹配任意中间目录
3. 查看已暂存和未暂存的修改
- git diff 比较的是当前文件和暂存区快照之间的差异
- git diff --staged/–cached 查看已暂存的将要添加到下次提交的内容
4. 提交更新
-
git commit 提交暂存区的文件到仓库
git commit // 会启动内置或者配置的文本编辑器进行 message 的书写 git commit -m "git commit test" // 直接指定提交内容参数
-
跳过暂存区进行提交
在提交的时候,使用 git commit -a ,git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
git add file git commit -m "add commit" --> git commit -a -m "跳过 add 直接 commit" // 同时也会将就不需要的文件一起提交
5. 移除文件
- 从 Git 中移除文件,就必须从已跟踪文件清单中移除,然后提交。 git rm
- 如果删除之前修改过或者已经存放到暂存区的文件,则必须使用强制删除选项 -f(force)。
- 文件从 git 仓库中删除,本地继续保留。 git rm --cached file
6. 移动文件
-
git 文件改名
git mv file_from file_to 等同于: mv file_from file_to git rm file_from git add file_to
7. 查看提交历史
- git log 在未传入任何参数的情况下,git log 会按照时间先后顺序列出所有的提交,最近的更新在最上面
- git log -p/–patch -2
- -p:会显示每次提交所引入的差异(按补丁的格式输出)
- -2:会显示最近的两次操作
- git log --stat 每次提交的简略信息
- git log --pretty 使用不同于默认的方式展示提交历史
- git log --format 定制记录的显示格式
Git 远程仓库的使用:
1. 查看远程仓库
git remote -v // 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的URL
2. 添加远程仓库
git remote add <shortname> <url> // 添加一个新的远程仓库,同时指定一个方便使用的简写。之后可以在命令行中使用 shortname 代替整个 URL, 拉去远程仓库信息 git fetch <shortname>
3. 从远程仓库中拉去与抓取
git fetch <remote> // 从远程仓库中获取数据,直接访问远程仓库拉取你还没有的信息。执行完成后,你将拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git fetch : 会将数据下载到你的本地仓库,并不会自动合并或修改你当前的工作。必须手动合并入你的工作。
git pull // 如果你的当前分支设置了跟踪远程分支,将自动抓取合并该远程分支到当前分支。
4. 推送到远程仓库
git push <remote> <branch>
git push origin master // 将当前文件内容备份到远程 git 仓库
1. 如果有同时推送情况出现,必须先拉去最后一次推送的版本到本地进行合并后,才能正常推送
5. 查看某个远程仓库
git remote show <remote> // 查看远程仓库信息
6. 远程仓库的重命名与移除
git remote rename <old_shortname> <new_shortname> // 修改一个远程仓库的简写名
git remote remove/rm <shortname> // 移除一个远程仓库
Git 打标签:
Git 可以给仓库历史中的某一个提交打上标签,例如:使用标签标记发布节点(v1.0、v2.0)。
1. 列出标签
git tag -l/--list // 列出全部已有标签
git tag -l/--list "v1.8.5" // 列出匹配的已有标签
2. 创建标签
-
轻量级标签(lightwerght)
像一个不会改变的分支–它只是某个特定提交的引用
git tag v1.4-lw
-
附注标签(annotated)
存储在 git 数据库中的一个完整对象,它们是可以校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。
git tag -a v1.4 -m "my version 1.4" 1. -a:标识其为附注标签 2. -m:指定了一条将会存储在标签中的信息,若未指定则会启动默认编辑器请求输入
3. 后期打标签
1. git log --pretty=oneline // 列出历史版本号
2. git tag -a v1.2 9fceb02 // 在对应的版本号上打上对应的标签
4. 共享标签
git push 并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式的推送标签到共享服务器上。
git push origin <tagname> // 推送指定 tagname 的标签
git push origin --tags // 将把所有不在远程仓库服务器上的标签全部传送到服务器上
5. 删除标签
本地删除标签:
git tag -d <tagname> // 删除一个指定的轻量级标签
删除远程仓库标签:
1. git push <remote> :refs/tags/<tagname> // 使用空值替换远程仓库标签
2. git push <remote> --delete <tagname> // 直观的删除 远程仓库标签
6. 检出标签
git checkout <tagname> // 查看某个标签所指向的文件版本,这会使你的仓库处于“分离头指针(detached HEAD)" 的状态。
在分离头指针状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何分支,并且将无法访问, 除非通过确切的提交哈希才能访问。
Git 别名:
如果不想每次输入完整的 Git 命令,可以通过
git config
来轻松地为每一个命令设置一个别名。
例如:
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
当需要输入 git commit
时,只需要输入 git ci
。
常用别名示例:
-
解决取消暂存文件的易用性问题,可以向 git 中添加你自己的取消暂存别名:
git config --global alias.unstage 'reset HEAD --'
-
显示最后一次提交的日志信息
git config --global alias.last 'log -1 HEAD'
Git 分支:
1. 分支简介
Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照。
Git 的分支,其本质上仅仅是指向提交对象的可变指针。 git 的默认分支名字是 master 。在多次提交操作之后,其实已经有一个指向最后那个提交对象的 master 分支。master 分支会在每次提交时自动向前移动。
git 的 master 分支并不是一个特殊分支。它就跟其他分支完全没有区别,之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。
1.1 分支的新建
git branch <branchname> // 创建一个可以移动的新的指针
git log --online --decorate // 查看各个分支当前所指的对象
git checkout -b <newbranchname> // 创建新分支的同时切换过去
1.2 分支切换
git checkout <branchname> // 切换到新的分支上
git log --online --decorate --graph --all // 输出提交的历史、各个分支的指向以及项目的分支分叉情况
2. 分支的新建与合并
1. 创建第二分支并切换
git checkout -b secondbranch
2. 添加编辑,并对当前分支提交编辑
git commit -a -m "second operation"
3. 切换到主分支
git checkout master
4. 基于 master 分支创建紧急问题解决分支 hotfix
git checkout -b hotfix
5. 提交修补
git commit -a -m "紧急问题修复"
6. 测试正常,合并到 master 分支
git checkout master
git merge hotfix
7. 删除多余的 hotfix 分支
git branch -d hotfix
8. 切换为 第二分支继续开发工作
git checkout secondbranch
分支的合并:
git checkout master
git merge secondbranch
git branch -d secondbranch
遇到冲突时分支合并:
在不同的分支中对同一个文件进行不同的修改,git 就没法进行干净的合并。从而产生合并冲突。
当 git merge
处于冲突状态时,git 会停止合并,并标记出冲突文件(unmerge)。可以使用 git status
查看处于冲突状态的文件。手动解决冲突,并使用 git add
把新文件添加到暂存区。再进行合并提交操作 git commit
。
3. 分支管理
git branch // 显示所有的分支列表,其中 * 表示正在使用的分支(HEAD 指向的分支)
git branch -v // 显示所有分支最后一次提交信息
git branch --merged // 查看已经合并到当前分支的分支列表
git branch --no-merged // 查看尚未合并到当前分支的分支列表
git branch --no-merged master // 查看尚未和 master 分支合并的分支
分支删除:
git branch -d <branchname> // 删除分支,如果该分支已经和当前分支存在合并。否则删除失败
git branch -D <branchname> // 删除分支,无论该分支是否产生合并
4. 分支开发工作流
5. 远程分支
远程引用是对远程仓库的引用(指针),包括分支和标签等。
git ls-remote <remote>
显示的获取远程引用的完整列表
git remote show <remote>
获取远程分支的更多信息
git fetch <remote>
抓取远程仓库数据,并同步本地没有数据
5.1 推送:
git push <remote> <branch>
推送新更新到远程仓库
git push <remote> <old_branch>:<new_branch> // 将oldbranch分支内容推送到远程仓库newbranch上
5.2 跟踪分支:
跟踪分支的目的就在于 git pull
时会自动在仓库拉去所有跟踪分支内容
克隆一个仓库会自动创建一个跟踪
origin/master
的master
本地分支。git checkout -b <branch> <remote>/<branch>
创建一个自定义分支跟踪远程仓库指定分支。
git checkout --track <remote>/<branch>
创建本地的远程跟踪分支
git branch -u/--set-upstream-to <remote>/<new_branch>
更改当前分支跟踪的上游分支
当设置好跟踪分支后,可以通过简写@{upstream}或@{u}来引用它的上游分支。可以使用
git merge @{u}
来取代git merge <remote>/<branch>
。
git branch -vv
查看所有跟踪的分支,只是显示你最后一次抓取的数据进行比较git fetch --all // 先从仓库抓取所有的数据 git branch -vv
5.3 拉取:
git fetch
从服务器上抓取本地没有的数据,不会修改工作目录中的内容。只会获取数据然后让你自己合并。
git pull
会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。相当于 git fetch
+ git merge
5.4 删除远程分支:
git push <remote> --delete <branch>
删除远程分支。git 只是在服务器上移除当前分支的指针,通常会继续存在一段时间,等待垃圾回收运行才会清理。
6. 变基
git 合并文件的两个方式:merge 和 rebase(变基)
rebase: 将提交到某一分支上的修改都转移到另一分支上
git rebase master secondbranch // 直接将 secondbranch 分支变基到 master 分支上,不需切换分支
git checkout secondbranch // 切换到第二分支
git rebase master // 从版本差距处开始 将所有修改全部和并到 master 分支上
git checkout master // 切换到 master 分支
git merge secondbranch // 进行一次快进合并
rebase 的优势: 变基使得提交历史更加整洁,查看经过变基的分支的历史记录时会发现,尽管实际开发是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。
一般用作分支开发工作时确保在向远程分支推送时能保持提交历史的整洁。
本地开发–>变基到 master 分支上–>再向项目提交修改 这样项目维护者就不需要进行整合工作,只需要进行快进合并即可。
git rebase --onto master second secongother // 将第二分支上分支直接变基到 master 上,并继续保留 second 分支进行后续的开发
注意: 提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。变基一般是在本地完成变基后提交