Git 初次接触
查看版本&查看配置
git --version git config --list // 查看单独某项配置 git config user.name 复制代码
配置
git config --global user.name "coderLi" git config --global user.email "coderLi@xxx.com" 复制代码
如果使用了 --global 选项、那么该命令只需要运行一次、因为之后无论你在该系统上做任何事情、Git 都会使用那些信息。
由于 Git 会从多个文件中读取同一配置的变量的不同值。可以通过查询 Git 中该变量的原始值、它会告诉你哪一个配置文件最后设置了该值
git config --show-origin user.name file:/Users/coderLi/.gitconfig coderLi 复制代码
获取帮助
git help <verb> git <verb>--help man git-<verb> git add -h 复制代码
Git 基础
- 配置并初始化一个仓库
- 开始或停止跟踪文件
- 暂存或提交更改
获取仓库
获取 Git 仓库通常有两种方式
- 将尚未进行版本控制的本地目录转为 Git 仓库
- 从其他服务器克隆一个已存在的 Git 仓库
初始化仓库
cd /Users/user/my-project git init 复制代码
该命令创建一个名为 .git 的字幕了、这个子目录有你初始化 Git 仓库中所有的必须文件、这些文件是 Git 的仓库骨干。
如果该文件夹下有问价需要进行版本控制、你应该开始追踪这些文件并进行初始提交。
可以通过 git add 命令来制定所需的文件进行追踪、然后执行 git commit
git add *.java git add readme.md git commit -m 'initial project version' 复制代码
克隆现有的仓库
这时就要使用 Git clone 命令、如果你对其他 VCS很熟悉、请留意一下你所使用的命令是 “clone” 而不是 “checkout” 。这是 Git 区别于其他吧版本控制系统的一个重要特性、Git 克隆的是 Git仓库服务器上的几乎所有数据、而不是仅仅复制完成你的工作所需要的文件。当执行 git clone 命令时、默认配置下原创 Git 仓库中的每一个文件的每一个版本都将被拉取下来。事实上、如果你的服务器磁盘坏掉了、你通常可以使用任何一个克隆下来的用户端重建服务器上的仓库
# git clone <url> git clone https://github.com/libgit2/libgit2 复制代码
会在当前目录下创建一个名为 libgit2 的目录、并在这个目录下初始化一个.git 文件夹、从远程仓库拉取下所有数据放入.git 文佳佳、然后从中读取最新版本的文件拷贝。如果你进入到新建的这个libgit2 文件夹中、你会发现所有的项目文件已经在里面了、准备就绪等后续开发和使用。
如果你想自定义本地仓库等名字、可以通过额外参数指定
git clone https://github.com/libgit2/libgit2 mylibgit 复制代码
本地仓库名就变为了 mylibgit
记录每次更新到仓库
工作目录下的每个文件都不外乎这两种状态:
- 已跟踪、是指那些被纳入了版本控制的文件、在上一次快照中有它们的记录、在工作一段时间之后、它们的状态可能是未修改、已修改或已经放入暂存区。简而言之、已跟踪的文件就是 GIt 已经知道的文件
- 工作目录中除已跟踪文件外其他的文件都属于未跟踪文件、它们既不存在上一次的快照中、也米有被放入暂存区。初次克隆某个仓库时、工作目录中的所有文件都属于已跟踪文件、并处于未修改状态
检测当前文件状态
git status 命令产看哪些文件处于什么状态
跟踪新文件
git add README 复制代码
使用 git add 开始跟踪一个文件、并将其放入到暂存区。如果此时提交、那么该文件在你运行 git add 时的版本将被留存在后续的历史记录中。git add 命令使用文件或目录的路径作为参数、如果参数时目录的路径、该命令将递归地跟踪该目录下的所有文件
暂存已修改的文件
git add 是一个多功能命令、可以用它来跟踪新文件、或者把已跟踪的文件放入暂存区、还能用于合并时把有冲突的文件标为已解决状态。
这个命令可以理解为:精确地将内容添加到下一次提交中。
状态概览
git status 命令输出十分详细、但其用于有些繁琐、使用 git status -s 简化输出方式
忽略文件
一般我们总有一些文件无需纳入 Git 的管理、也不希望它们出现在未跟踪文件列表中。在这种情况下、我们可以创建一个名为.gitignore的文件、列出要忽略的文件的模式。
*.[oa] *~ 复制代码
第一行告诉 Git 忽略所有以.o或.a 结尾的文件。
第二行告诉我们忽略所有名字以~结尾的文件。
查看已暂存和未暂存的修改
git diff 比较的是工作目录中当前文件和暂存区快照之间的差异、也就是修改之后还没暂存起来的变化内容。
若要查看已暂存的将要添加都下次提交里的内容、可以使用 git diff --staged 命令、git diff --cached
需要注意的是、git diff 本身只现实尚未暂存的改动、而不是自上次提交以来所做的所有改动。所以如果你一下子暂存了所有更新过的文件、运行 git diff 后却什么也没有、就是这个原因。
提交更新
现在暂存区已经准备就绪、可以提交了。
git commit -m 'information' 复制代码
跳过使用暂存区
尽管使用暂存区域的方式可以精心准备要提交的细节、但有时候这么做显得繁琐、Git 提供了一个跳过使用暂存区域的方式、只要在提交时、在 git commit 加上 -a 选项、Git 就会自动把所有已经追踪过的文件暂存起来一并提交、从而逃过 git add 步骤。
移除文件
从 Git 中移除某个文件、就必须从暂存区中移除、然后提交。git rm 命令可以完成此项工作、并连带从工作目录中删除置顶文件、这样以后就不会出现在未跟踪文件清单中了。
$ls DijkstraJourneyGeneratorTest.java cassandra redis Generic.java ehcache repository $git rm Generic.java $git status Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: Generic.java 复制代码
如果只是单纯的在工作目录中删除文件、而没有对齐进行提交、是不能在 Git 中删除该文件的
$ls DijkstraJourneyGeneratorTest.java cassandra redis Generic.java ehcache repository $rm Generic.java $git status Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: Generic.java 复制代码
这个时候你还是要执行 git rm Generic.java 来将这个删除添加到暂存区
如果要删除已经放到暂存区的文件、则必须使用强制删除项 -f
$ vi Generic.java $ git add Generic.java 复制代码
第一步我们修改了 Generic.java 这个文件、然后将其放入到暂存区、但是这个时候我们想删除这个 Generic.java 文件并且想将此次提交到暂存区的版本也删除掉
$git rm -f Generic.java $git status Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: Generic.java 复制代码
这个时候、我们工作目录下也删除了 Generic.java 的问价、并且刚刚修改Generic.java的版本也在暂存区中删除了。
移动文件
git mv file_from file_to 复制代码
$git mv Generic.java Generic01.java $git status Changes to be committed: (use "git restore --staged <file>..." to unstage) renamed: Generic.java -> Generic01.java 复制代码
其实运行 git mv就相当于运行了下面三条命了
$mv Generic.java Generic01.java $git rm Generic.java $git add Generic01.java 复制代码
查看提交历史
git log 在不传入任何参数的默认情况下、git log 会按时间先后顺序列出所有的提交、最精的更新排在最上面。
git log 有很多选项帮助你搜寻你所要查找的提交、其中最有用的就是 -p/-patch 选项、它会显示每次提交所引入的差异(按补丁格式显示)。
也可以限制显示日志的条目数量、例如使用 -2 显示最近的两次提交。
撤销操作
在任何一个阶段、你都有可能想要撤销某些操作。有时候我们提交完了才发现漏掉了几个文件没有添加、或者提交信息写错了、此时、可以使用带有 --amend 选项来提交命令重新提交
git commit -m 'renew' -amend 复制代码
这个命令会将暂存区中的文件提交、如果自上次提交以来你还未做任何修改、那么快照将会保持不变、而你修改的只是提交信息。
最终只会有一个提交、而第二次提交将会代替第一次提交的结果。 第一次的提交就像从未存在过一、它并不会出现在仓库的历史中。
取消暂存的文件
git add -A git status Changes to be committed: (use "git restore --staged <file>..." to unstage) ..... ..... 复制代码
我们可以使用该命令将暂存区的版本删除掉
git restore --staged xxx.java 复制代码
撤销对文件的修改
同样也是使用 git restore xxx.java
撤销commit
当我们想撤回一个本地的 commit 的时候、怎么办
可以使用 git reset HEAD^
这样就可以成功撤销你的 commit
head^ 等同于 head~1 表示git 仓库的上一个版本 如果你提交了两个 commit 都想撤回、可以使用 head~2 表示 复制代码
还可以在这个命令中加上选项参数
- --mixed 不删除工作空间改动代码、撤销 commit 并且撤销 git add 操作、默认使用就是这个参数
- --soft 不删除工作空间改动代码、撤销 commit、但是不撤销 git add
- --hard 删除工作空间改动代码、撤销 commit、撤销 git add 相当于回到上一次commit状态
git checkout
git checkout 最常见的用法莫过于对工作分支的切换了
git checkout branchName # 该命令会将当前工作分支切换到 branchName中 复制代码
也可以通过下面的命令在新分支创建的同时切换分支
git checkout -b newBranch 复制代码
该命令相当于
git branch newBranch git checkout newBranch 复制代码
该命令完整语法为
git checkout -b new-branch-name copy-branch 复制代码
该命令的主要关联目标其实是.git文件夹下的HEAD文件、HEAD文件记录了当前HEAD的信息
扩展用法
git checkout yyy.java git checkout origin/master xxx.java 复制代码
该命令主要用于检出某一个指定文件。如果不填写 commit id、则默认从暂存区检出该文件、如果暂存区为空、则该文件会回滚到最近一次提交状态
也可以指定从远程分支中checkout某个文件
远程仓库的使用
查看你已经配置的远程仓库服务器、可以使用 git remote 命令、它会列出你指定的每一个远程服务器的简写。如果你已经克隆了自己的仓库、那么至少应该能看到origin、这是 Git 给你克隆仓库服务器的默认名字
git remote # 显示对应的 url git remote -v 复制代码
添加远程仓库可以使用 git remote add
从远程仓库中抓取和拉取
- git fetch 命令只会将数据下载到你的本地仓库--它并不会自动合并或修改你当前的工作空间、当准备好时你必须手动将其合并
- git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支
推送到远程分支
git push origin master 复制代码
可以使用命令查看远程仓库的情况
git remote show orign 复制代码
打标签
Git 可以给仓库历史中的某个提交打上标签、以示重视。Git 支持两种标签、一种是轻量级标签、一种是附注标签。
轻量级标签很想一个不会改变的分支--它只是某一个特定提交的饮用
而附注标签是存储在 Git 参考中的一个完整对象、它是可以被检验的、其中包含打标签的行吗、电子邮件地址、日期时间、还有标签信息。
通常会建议创建附注标签。
- 列出标签 git tag -l
- 创建标签 git tag tagName / git tag -a tagName -m 'message about tag'。加上 -a 创建的是附注标签、不加上的是一个轻量级标签
- 展示某个标签内容 git show tagName
- 删除标签 git tag -d tagName
默认情况下、git push 命令并不会传送标签到远程仓库服务器上。在创建万标签后你必须显示地将标签推送到服务器上、这个过程就行你共享远程分支一样。git push orign tagName