git学习指南
1.安装git
2.安装完成后需要在命令行下设置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
因为git分布式版本控制系统,所有每个机器都需要自报家门,以方便查看是由谁提交的代码。
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
3.创建版本库(repository)
3.1 创建版本库,可以有效管理项目文件
mkdir learngit
cd learngit
3.2 将这个目录变成git可以管理的仓库
git init
更改完成之后当前目录下会生成一个隐藏目录文件.git ,此目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
4.将文件添加到版本库中
4.1 把文件添加到仓库
git add file
git add file1 file2
git add .
4.2 把文件提交到仓库
git commit -m "log_message"
5.查看当前仓库的状态
5.1使用git status 可以查看当前仓库是否被修改
git status
5.2若被修改就,使用git diff 可以查看修改的内容
git diff
6.版本回退
6.1 在日常开发中,如果想知道文件都修改了什么,可以使用以下命令
git log
git log --pretty=oneline
6.2 在git中使用HEAD 表示当前版本,上一个版本是HEAD^
上上一个版本是HEAD^^ 当然可以使用HEAD~100 代表第一百个版本
git reset --hard HEAD^
6.3 查看文件内容是不是被还原
cat file
回退之后,最新的那个版本已经无法再使用git log 看到了
若想再次回到之前的版本,需要如下操作:
找到回退前的版本ID
git reset --hard ID
再次查看版本内容是不是又恢复了
使用以下命令可以快速查找相关ID
git reflog
7.工作区和暂存区
- 工作区(working directory):指的是当前工作的仓库目录,比如之前所创建的learngit目录
- 版本库(repository):工作区里面有一个隐藏目录
.git ,这个并不算工资区,而是Git的版本库,git的版本库里面存在很多东西,其中最重要的是stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master ,以及指向master 的一个指针叫HEAD 。
- 使用git add把文件添加进去,实际上就是把文件添加到暂存区中
- 使用git commit 提交更改,实际上就是将暂存区中的所有内容提交到当前分支
- 因为我们创建Git版本库时,Git自动为我们创建了唯一一个
master 分支,所以,现在,git commit 就是往master 分支上提交更改。
8.撤销修改
命令git checkout -- readme.txt 意思就是,把readme.txt 文件在工作区的修改全部撤销,这里有两种情况:
- 一种是
readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; - 一种是
readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit 或git add 时的状态。
git checkout -- file
修改后文件还没有add到暂存区时
git checkout -- file
git restore <file>
修改后文件已经add到暂存区,但还没有commit时
git reset HEAD file
git restore --staged <file>
git checkout -- file
git restore <file>
9.删除文件
如果你不小心将工作区里面的文件删除了,工作区和版本库此时就不一致,使用git status 则可以看到有提示
[root@VM-0-16-centos test]
此时如果真的需要删除
git rm file
删掉之后并且 git commit 一下
另外一种是如果需要恢复文件
git checkout -- <file>
10.远程仓库
10.1 创建SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
10.2 将公钥复制到github上
cd .ssh
公钥存在id_rsa.pub中
10.3 关联远程库
git remote add origin git@github.com:Fairy-qun/Python.git
10.4 推送master分支内容到远程库
git push -u origin master(分支可自行更改)
记一次小错误
To github.com:Fairy-qun/Python.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'github.com:Fairy-qun/Python.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
线上线下文件不一致导致
git pull --rebase origin master
10.5 拉取远程库的项目
git clone git@github.com:Fairy-qun/Python.git
11.分支管理
11.1 创建与合并分支
创建test分支
git checkout -b test
git switch test
切换分支
git branch test
git checkout test
git checkout -b test
git switch -c test
查看当前分支列表
git branch
之后就可以正常在此分支上提交
若在此分支上的工作完成之后,就可以切换回master分支
回到master分支后可以知道在其他分支上所做的操作都没有,仅仅时提交在了其他分支上,如果需要的话,将其合并到master分支上
合并分支
git merge test
合并完成后再查看就能够在其他分支最新提交状态一样
删除分支
git branch -d test
11.2 分支管理策略
通常合并分支时,Git会默认用Fast forward 模式,但是在这种模式下,删除分支后,会丢掉分支的信息。
解决方案:
使用--no-ff方式的git merge来强制解除Fast forward模式,这样在merge时,就会生成一个新的commit,就可以从分支的历史信息上看出分支的信息
实操:
git switch -c test
git add file
git commit -m "log_message"
git switch master
git merge --no-ff -m "merge with no-ff" test
git log
11.3 Bug分支
在需要修改bug时,可以先将正在某个分支上的工作隐藏起来,待bug恢复后,在恢复分支上的信息继续工作
git stash
git stash list
1. git stash apply
2. git stash pop
再使用git stash list就没有任何的stash内容了
git stash apply stash@{0}
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
解决方案:
为了方便操作,Git专门提供了一个cherry-pick 命令,让我们能复制一个特定的提交到当前分支:
git cherry-pick <commit id>
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name> 强行删除。
git branch -D <name>
12.标签管理
12.1 创建标签
在git中打标签非常简单,首先,切换到需要打标签的分支上:
git branch
git checkout master
然后,使用以下命令就可以打标签:
git tag v1.0(任意值)
git tag
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
git log --pretty=oneline --abbrev-commit
git tag v0.9 commitID
再使用git tag查看
如果需要查看某个标签的信息
git show tag-v0.9
还可以创建带有说明的标签,用-a 指定标签名,-m 指定说明文字:
git tag -a v0.1 -m "log_message" commitID
使用git show v0.1可以看到说明文字
12.2 标签操作
如果标签打错了,也可以删除:
$ git tag -d v0.1
Deleted tag 'v0.1' (was f15b0dd)
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令git push origin <tagname> :
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v1.0 -> v1.0
或者,一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v0.9 -> v0.9
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
Deleted tag 'v0.9' (was f52c633)
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
To github.com:michaelliao/learngit.git
- [deleted] v0.9
要看看是否真的从远程库删除了标签,可以登陆GitHub查看。
13.gitee简单使用
简易的命令行入门教程:
13.1 Git 全局设置:
git config --global user.name "Qun"
git config --global user.email "1837322086@qq.com"
13.2 创建 git 仓库:
mkdir python
cd python
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:lixiaomai/python.git
git push -u origin "master"
13.3 已有仓库?
cd existing_git_repo
git remote add origin git@gitee.com:lixiaomai/python.git
git push -u origin "master"
的命令行入门教程:
13.1 Git 全局设置:
git config --global user.name "user"
git config --global user.email "example@qq.com"
13.2 创建 git 仓库:
mkdir python
cd python
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:lixiaomai/python.git
git push -u origin "master"
13.3 已有仓库?
cd existing_git_repo
git remote add origin git@gitee.com:lixiaomai/python.git
git push -u origin "master"
|