摘要:廖雪峰的官方网站学习 git 基础
1.自身信息
1 | git config--global user.name "Your Name" // 姓名 |
2.创建仓库
1 | mkdir xxx // 创建文件夹xxx |
3.初始化仓库
1 | git init // 初始化仓库,将这个目录变成Git可以管理的仓库 |
此时会有一个.git
的隐藏文件夹,可以使用ls -A
命令显示出来
4.添加
1 | echo "注意事项" >> README.md // 创建README.md |
5.提交
1 | git commit -m "first commit" // 提交,-m后面是本次提交说明 |
6.查看状态
修改 README.md 文件为
1 | 注意事项 |
执行命令
1 | git status // 显示当前目录下文件的状态 |
提示 README.md 被修改,但没有提交
1 | git diff README.md // 显示该文件修改的详细信息 |
有时候还会有这样的信息warning: LF will be replaced by CRLF in README.md.
执行git config --global core.autocrlf false
可以取消该警告,详细看CRLF 和 LF
此时执行cat ~/.gitconfig
显示
1 | [user] |
7.提交修改
再次执行git add README.md
将文件提交到缓存区
查看此时状态git status
1 | On branch master |
一定要记住:只有 add 之后的修改才能被 commit,在执行 commit 之前的操作一定是 add
再次查看状态git status
1 | On branch master |
8.查看历史记录
1 | git log // 显示从最近到最远提交的历史记录 |
9.版本回退
1 | git reset --hard HEAD^ // 回退到上个版本 |
10.记录每次命令
1 | git reflog // 显示执行命令的历史及对应的版本号 |
再次执行git reset --hard b9ed83e
即可回退到对应版本
11.工作区(Working Directory)
作区就是平时工作修改代码的区域(xxx 目录),但不包含.git
12.版本库(Repository)
.git
目录是 Git 的版本库,它里面有称为 stage(或者叫 index)的暂存区、分支(主分支 master 自动创建)、指向 master 的一个指针 HEAD 和其他一些东西。
分两步将文件添加到 Git 版本库里: 1.git add
实际上就是把文件修改添加到暂存区 stage 中 2.git commit
就是把暂存区 stage 中的所有内容提交到当前分支,之后暂存区 stage 中就没有任何内容了
因此,commit 提交修改之前一定要 add 将修改保存到暂存区
untracked:未跟踪,此文件在文件夹中,但并没有加入 git 库,不参与版本控制。 通过git add
,git commit
可将它置入跟踪库
unmodify:文件已经库中,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两个去处,如果它被修改,而成为 modified。如果使用git rm
移出版本库,则成为 untracked 文件
modified:文件已修改,仅仅是修改,并没有进行其它操作。这个文件也有两个去处,通过 git add 可进入暂存(staged)状态,使用git checkout
则丢弃修改,返因到 unmodify 状态。这个 checkout 很好理解,就是取出库中文件,覆盖当前文件
staged:暂存状态。执得git commit
则将修改同步到库中,这时库中的文件与本地文件又一致了,于是文件是 unmodify 状态。执行git reset HEAD filenam
取消暂存,文件状态变为 modified
13.撤销修改
撤销文件在工作区的修改:
1 | git checkout -- README.md |
取消本次 add 操作,把暂存区的修改回退到工作区。HEAD
表示最新的版本
1 | git reset HEAD README.md |
14.删除文件
删除也是一个修改操作,可以直接在文件管理器中删除文件,也可以使用命令删除
1 | rm README.md // 删除工作区的文件 |
如果确定删除,可以使用 add 将删除操作保存到暂存区后再 commit 到版本库;如果想取消工作区的删除,可以使用git checkout -- README.md
来恢复文件
1 | git rm README.md // 删除工作区和暂存区的文件 |
如果想要撤销删除,可以使用git checkout -- README.md
回退到上次 commit 时的状态,但是上次 commit 之后修改的内容会丢失;如果确认删除,可以提交到版本库生成新版本
1 | git commit -m 'remove README.md' |
15.远程仓库
连接 github 步骤: 1.创建 SSH Key。git 下执行
1 | ssh-keygen -t rsa -C "xxx@xxx.com" // 填自己的邮箱 |
然后一路回车,就可以在用户主目录里找到.ssh
目录,里面id_rsa
是私钥不可以告诉别人,id_rsa.pub
是公钥 2.登录 github,点击右上角头像,选择Settings。进入新页面后,选择左侧列表SSH and GPG keys,再点击New SSH key
按钮。接着随意填写 Title,再将id_rsa.pub
中的内容复制粘贴到 Key,最后点击Add SSH key
即可 3.创建远程仓库(名字叫 test,其他默认配置)后关联仓库,执行命令
1 | git remote add origin git@github.com:xxx/test.git // 关联远程仓库,空仓库中有相关命令提示,xxx是自己的账户名 |
第一次推送时使用-u 指定了当前主机为默认主机(如果当前分支与多个主机存在追踪关系,使用-u 选项则会指定一个默认主机),这样后面就可以不加任何参数推送
1 | git push origin master |
16.从远程库克隆
将自己远程库 test 中的所有文件克隆到本地,一般先要复制远程库地址
1 | git clone git@github.com:xxx/test.git // xxx是自己的账户名 |
17.创建分支
git 分支创建与合并的原理:创建与合并分支,图文详细明了
创建分支,第一种方法
1 | git branch test // 创建test分支 |
第二种方法
1 | git checkout -b test // 相当于创建并切换到test分支 |
查看分支
1 | git branch |
*
表示当前所在分支
18.合并分支
将 test 分支合并到 master 主分支:先切换到 master 分支再合并
1 | git checkout master // 切换到master分支 |
成功后会显示一些提示信息
1 | Updating 82dfe5a..4dc62d7 |
19.删除分支
已经合并过的分支需要删除
1 | git branch -d test // 合并后删除 |
如果要删除一个没有被合并过的分支
1 | git branch -D test // 强行删除 |
20.处理冲突
git status
可以告诉我们发生冲突的文件,发生冲突的文件会用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容。手动修改这些冲突后重新走一遍代码提交流程就好了:add、commit、push,这样就提交到了远程库
21.分支策略
1、master 主分支应该是非常稳定的,仅用来发布新版本
2、平时都合并到 dev 开发分支,确定没问题后合并到 master 分支。比如我的代码都在 test 分支上,我先合并到 dev 分支,看到没问题,而且其他小伙伴们的代码合并到 dev 分支后也都没问题,此时就可以将 dev 分支合并到 master 分支上发布了
3、git 通常会使用 Fast forward 模式合并分支,但删除分支后,会丢掉分支信息。使用--no-ff
禁用 Fast forward 模式,会在 merge 时生成一个新的 commit,从分支历史上就可以看出分支信息。
1 | git merge --no-ff -m "merge with no-ff" test |
4、git 提供了一个 stash 功能,可以把当前工作现场“储藏”起来,以便进行更紧急的任务(修复 bug 等)。处理完紧急任务后,还可以恢复现场继续工作
1 | git stash // 储藏当前环境 |
完成紧急任务后,恢复原来工作现场
1 | git stash list // 查看stash列表 |
可以多次 stash,恢复时先查看 stash 列表,再指定版本即可,不指定就是默认版本号为 0 的那个
1 | git stash apply stash@{0} |
如果 stash 列表都不需要了,可以清除 stash
1 | git stash clear // 清除stash |
22.查看远程库信息
从远程仓库克隆时,git 自动把本地的 master 分支和远程的 master 分支对应起来,远程仓库的默认名称是 origin
1 | git remote |
显示更详细的信息
1 | git remote -v |
23.推送分支
master 分支是主分支,因此要时刻与远程同步;dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
1 | git push origin master // 推送master主分支 |
24.抓取分支
要在 dev 分支上开发,就必须创建远程 origin 的 dev 分支到本地
1 | git checkout -b dev origin/dev |
25.远程库冲突
当推送到远程库 dev 分支的提交有冲突时,先指定本地 dev 分支与远程 origin/dev 分支的链接,再用git pull
把最新的提交从 origin/dev 抓下来,然后在本地合并,手动解决冲突,提交后再 push
1 | git branch --set-upstream dev origin/dev |
手动解决冲突,解决的方法和分支管理中的解决冲突完全一样
1 | git commit -m "dev conflict" |
26.多人协作
1.用 git push origin branch-name 推送自己的修改 2.如果推送失败,用 git pull 试图合并,如果提示“no tracking information”,用命令git branch --set-upstream branch-name origin/branch-name
建立链接关系 3.如果合并有冲突,则解决冲突,并在本地提交 4.最后用 git push origin branch-name 推送
27.创建标签
tag 就是一个让人容易记住的有意义的名字,它跟某个 commit 绑在一起
1 | git checkout master // 切换到需要打标签的分支上 |
28.操作标签
标签未推送到远程
1 | git tag -d v0.1 // 删除本地标签 |
标签已推送到远程,本地、远程都要删除标签
1 | git tag -d v0.9 // 删除本地标签 |
29.使用 GITHUB
现将开源项目 fork 到自己的库,然后从自己 fork 的库 clone 一份到本地。修改完后推送到自己的库,在 GitHub 上发起一个 pull request 来贡献代码
30.使用码云
在码云上注册账号并登录后,选择右上角用户头像 -> 菜单“设置”,然后选择左侧列表里的“SSH 公钥”,填写标题,将用户主目录下的.ssh/id_rsa.pub 文件的内容粘贴上。码云可以创建私有仓库,并且不超过 5 人的小团队可以免费使用多项服务
31.关联远程库
git remote
和git remote -v
可以查看远程库信息(一般默认远程库是 origin)
1 | git remote rm origin // 删除已关联的名为origin的远程库 |
一个本地库关联多个远程库
1 | git push gitee master // 推送到码云的master分支 |
32.醒目颜色
让 Git 显示颜色,会让命令输出看起来更醒目
1 | git config --global color.ui true |
33.忽略文件
配置.gitignore
文件忽略那些不想提交的文件,原则是:忽略操作系统自动生成的文件;忽略编译生成的中间文件、可执行文件等;忽略你自己的带有敏感信息的配置文件
最后将.gitignore
文件也提交到 git,并且可以对.gitignore
做版本管理
如果想要强制添加.gitignore
文件忽略的文件,可以使用-f
。如果.gitignore
文件写的有问题,也可以查看配置出现问题的位置
1 | git add -f test.txt // 强制添加文件 |
34.配置别名
使用--global
全局参数可以让这些命令在这台电脑的所有 Git 仓库都生效,用户全局的 Git 配置文件放在用户主目录下的一个隐藏文件.gitconfig
中;不使用--global
则只在当前仓库生效,每个仓库的 Git 配置文件都放在.git/config 文件中。如果想修改 git 的配置,可以直接修改这些文件
1 | git config --global alias.st status // 告诉git'st'表示'status' |