有时候一段时间没有去使用Git,一些操作就容易忘记,故此这里把一些基本常用的操作记录一下,方便大家学习和查看。
1. 本地库初始化
命令:git init
初始化之后,会创建一个隐藏的 .git 文件,可以查看一下。
查看隐藏文件,命令:ls -la
看一下 .git 文件下有什么,命令:ll .git/
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
2. 签名以及查看并设置签名
签名形式:
user = xxx
email = xxxx
签名作用: 用于区分不同的开发人员身份(其中的用户名和邮箱其实并不会去验证真实性和有效性,主要是用于区分不同的开发人员)。
注意: 签名和登录远程库的账号、密码没有任何关系。
项目级别/仓库级别: 仅在当前本地库范围内有效
相关命令:
查看项目级别的签名信息
cat .git/config
添加项目级别签名的用户名
git config user.name xxx
添加项目级别签名的邮箱
git config user.email xxx@xx.com
系统用户级别: 登录当前操作系统的用户范围
相关命令:
查看系统用户级别的签名信息
cat ~/.gitconfig
添加系统用户级别签名的用户名
git config --global user.name xxx
添加系统用户级别签名的邮箱
git config --global user.email xxx@xx.com
级别优先级
就近原则:项目级别优先于系统用户级别,也就是二者都有时,优先使用项目级别的签名;没有项目级别签名时,使用系统用户级别的签名。
一般设置一个系统用户级别的签名就可以了,项目有特殊需求时再单独设置项目级别的签名。
3. 基本操作
先了解一下Git 结构:
3.1 查看状态
命令:git status
用于查看工作区、暂存区状态。
3.2 添加到暂存区
命令:git add fileName
将对工作区的 “新建/修改” 添加到暂存区
3.3 提交到本地库
命令:git commit -m “commit message” [fileName]
将暂存区的内容提交到本地库。
如果不指定文件,会将所有暂存区的提交上去。
-m 是用来附带提交信息,如果不带 -m 参数:git commit fileName
那么会进入一个 vim 编辑器的编辑文件里,在这里个里面编辑提交附带的信息。
4. 版本控制
4.1 查看历史记录
- 命令:git log
多屏显示控制方式:
空格向下翻页
b 向上翻页
q 退出
注意,这个命令只能显示当前版本之前提交的版本。
-
命令:git log --pretty=oneline
每个版本以一行显示,只显示索引值和提交信息,略去提交时间和提交用户的信息。
注意,这个命令只能显示当前版本之前提交的版本。 -
命令:git log --oneline
每个版本以一行显示,只显示部分索引值(这一部分索引值足以区分不同版本)和提交信息。
注意,这个命令只能显示当前版本之前提交的版本。 -
git reflog
每个版本以一行显示,显示部分索引值和提交信息,并且显示了从当前所在版本到该版本需要移动的步数。
HEAD@{移动到当前版本需要多少步}
4.2 版本的改变
4.2.1 版本改变的基本操作
本质其实是将 HEAD 指针移动并指向需要的版本。
-
基于索引值操作(推荐)命令:git reset --hard 索引值
这个索引值可以是查看历史记录中显示那个部分索引值。
要去哪个版本,就加哪个版本的索引值。 -
使用 ^ 符号,命令:git reset --hard HEAD^
只能向后退,一个 ^ 表示向后退一步,n 个 ^ 表示向后退 n 步。 -
使用 ~ 符号,命令:git reset --hard HEAD~n
只能向后退,表示向后退 n 步。
4.2.2 版本改变命令的三个参数(sort、mixed、hard)
-
–sort
仅仅在本地库移动 HEAD 指针 -
–mixed
在本地库移动 HEAD 指针
重置暂存区 -
–hard (常用)
在本地库移动 HEAD 指针
重置暂存区
重置工作区
4.2.4 关于删除文件的恢复
直接使用版本改变命令回到文件删除之前即可。
git reset --hard [存在该文件时的版本索引]
注意: 只有文件被 commit 过的文件才能找回。
4.2.5 比较文件差异
-
命令:git diff [fileName]
将工作区中的文件和暂存区进行比较
-
命令:git diff [本地库中历史版本索引值][文件名]
将工作区中的文件和本地库历史记录中的文件比较 -
命令:git diff [本地库中历史版本索引值]
只带版本索引值,不带文件名,比较的是当前版本和指定历史版本中的多个文件
5. 分支管理
5.1 分支的概念
我们版本初始化好之后,就会有个 master 分支(也可以称为主干)。
分支的话就好像是从主干分出一条线出来,和主干互不影响,可以独立开发,当需要的功能开发完成后,可以将功能合并到主干上;如果开发失败或取消开发,可以直接删除这个分支,对主干没有任何影响。
5.2 分支的好处
- 可以在多个分支上并行推进多个功能的开发,提高开发效率。
- 一个分支开发失败,并不会对其他分支造成影响,可以直接将失败的分支删除或重新开始。
5.3 分支的操作
5.3.1 创建分支
命令:git branch [新建的分支名]
5.3.2 查看分支
命令: git branch -v
5.3.3 切换分支
命令:git branch [所要切换的分支名]
上面三个命令的演示:
5.3.4 合并分支
例子: 分支1 上的修改合并到 master 分支上。
-
切换到要接受合并的分支(比如例子中的 master 分支)。
git checkout [接受合并的分支] -
执行合并命令
git merge [有修改的分支,比如例子中的 分支1 ]
5.3.4 解决合并分支中的冲突
分支冲突:合并的两个分支对同一个文件做了不同的修改,产生了冲突,Git不知道该保留谁的。
解决冲突的合并:
-
编辑冲突的文件
-
将文件的冲突处修改成所需要的,并将特殊符号全部删除掉,然后保存退出。
-
将文件添加到暂存区:git add [刚刚冲突的文件名]
-
将修改提交上去:git commit -m “提交附带日志信息”
注意:这次的 commit 最后面一定不能带文件名。
6. 远程库相关操作
远程库:比如 GitHub 上的仓库。
远程库地址:比如 GitHub 上仓库的地址。
6.1 设置远程库地址别名
命令:git remote add [远程库地址别名] [远程库地址]
当然,虽然不设置别名也可以用,不过远程库地址一般比较长,使用起来很不方便,所有最好设置一下别名。
6.2查看当前所有远程库地址别名
命令:git remote -v
6.3 推送
命令:git push [远程库地址别名] [要推送的分支名]
将本地库中的某个分支推送到远程库中。
6.4 拉取
命令:git pull [远程库地址别名] [远程库分支名]
从远程库拉取某个分支到本地并合并。
pull = fetch +merge
git pull 其实是两个操作的组合,这两个操作也可以单独执行。
-
命令①:git fetch [远程库地址别名] [远程库分支名]
将远程库最新内容拉取到本地库,但是不会自动merge。 -
命令②:git merge [远程地址库别名/远程库分支名]
合并刚刚拉取下来的远程库。
6.4 解决冲突
如果我们 push 推送的时候不是基于最新版的远程库,那么就会产生冲突。
那么我们就要先将远程库的最新版 pull 拉取下来,解决了冲突并合并之后,再 push 推送上去。
解决合并分支中的冲突的方法和 5.3.4 中一样,修改冲突文件,然后 add 和 commit 。
6.5 克隆
命令:git clone [远程库地址]
会自动初始化本地库,还会自动创建远程库别名 origin,并且将完整的远程库下载到本地。
也就是说一个 clone 其实里面有三个步骤:
- 初始化本地库
- 创建远程库地址别名:origin
- 完整的将远程库下载到本地。
7. IDE 中的忽略文件
各个IDE中如何使用Git就不去说了,因为是图形化界面,一般都比较简单,实在不会的,可以找个教程看看。
这里最后说一下关于忽略文件。
因为一个团队大家使用的 IDE 可能不太同,相关工 程特定文件就有可能不同。如果这些文件加入版本控制,那么开发时很可能需要为了这些文件解决冲突,给打开造成不必要的麻烦。
所以可以在IDE中设置一个忽略文件,每次上传时自动忽略这些特定文件。
因为不同的 IDE 设置方法不太同,这里也不针对每个IDE说了。
我这里说一下 Intellij IDEA 怎么设置忽略文件:
忽略文件中的内容,可根据你项目使用的开发语言去选择。
可以去官网查看和选择:
https://github.com/github/gitignore
比如Java的:
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
这些命令其实都不难,但一定要多去练练,多去练练就会了。
看完之后,如果还有什么不懂的,可以在评论区留言,会及时回答更新。
点个关注,不再迷路
这里是猿兄,为你分享程序员的世界。
非常感谢各位大佬们能看到这里,如果觉得文章还不错的话,
求点赞👍 求关注💗 求分享👬求评论📝
这些对猿兄来说真的 非常有用!!!
注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!