git使用
Git学习推荐廖雪峰老师的Git教程
安装之后设置
- 设置用户名和邮箱
设置或者更改用户名和邮箱地址
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
查看用户名和邮箱地址
$ git config --global user.name
$ git config --global user.email
- 创建一个版本库(仓库repository)
打开Git Bash 在自己想要的目录下创建
$ cd xxxx
$ git init
Initialized empty Git repository in E:/repository/img/.git/
# git init 用于把当前目录变成一个可以管理的仓库
- 把文件放到Git仓库
在当前目录下游一个.git的目录。此目录是用来跟踪管理版本库的,不能乱改
在管理的目录或者子目录建立一个文件(git只能管理这里面的文件)。 把文件放到Git仓库只需两步
-
git add xxx
告诉Git,把文件添加到仓库 xxx 为文件可以是多个文件 提交到暂存区 -
git commit -m
告诉Git,把文件提交到仓库 -m 为提交说明 提交到分支 - 两个一起就是提交到仓库
- 常用命令
git status 查看结果(查看文件的状态)
git diff 查看文件的修改内容
git log 查看当前版本和此版本修改之前的历史记录
git log --pretty=oneline 一行显示
git reset --hard HEAD^ 回退到上一个版本 HEAD表示是当前版本 HEAD^^上上个版本 HEAD~(number)回退到第number个版本
git reflog 打印对分支的更改记录 (可以用来记录之前commit命令的commit id)
git reset --hard commit id 重新回到commit id 的新版本 这两个命令用于还原之前被回退的版本
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
工作区(Working Directory)
就是你在电脑里能看到的目录
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
git checkout --file 撤销修改(未添加到暂存区)现在一般用 git restore
如果要撤销修改add过的文件可以使用git reset HEAD file 重新回到工作区再调用git checkout --file 丢弃工作区的修改
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
新版本的另一个种修改方法
命令 | 作用 | 备注 |
---|---|---|
git restore --worktree file | 表示撤销file文件工作区的修改 | 参数等同于-W |
git restore --staged file | 表示插销暂存区的修改,将文件状态恢复到add之前 | 参数等同于-S |
git restore -s HEAD~1 README.md | 表示将当前工作区切换到上个 commit 版本 | |
git restore -s dbv213 README.md | 表示将当前工作区切换到指定 commit id 的版本 | |
git restore file | 撤销工作区的修改返回这里有两种情况一是修改没有放进暂存区撤销就和版本库中一模一样,二是存放进了暂存区撤销撤销就是回到暂存区后的状态 |
删除文件也是一种修改
如果在工作去删除了文件有两个选错,一是确定从仓库中删除文件git rm file
并且git commit -m
二是误删想恢复可以用 git checkout --file
或者git restore file
-
创建SSH key 将GitHub作为自己的remote端服务器
第一步:在用户主目录下,查看有么有.ssh目录,再看看这个目录下有么有SSH Key秘钥对id_rsa和id_rsa.pub两个文件
第二步 如果有进入下一步,没有打开Sell(Windows打开Git Bash),创建SSH Key;$ ssh-keygen -t rsa -C "youremail@example.com"
代码参数含义:
-t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名。以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:
Generating public/private rsa key pair.
# Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
当然,你也可以不输入文件名,使用默认文件名(推荐),那么会生成id_rsa(私钥不能泄露出去)和id_rsa.pub(公钥,可以放心地告诉任何人)两个秘钥文件
接着又会提示你输入两次密码(该密码是push文件的时候要输入的密码而不是gihub管理者的密码)当然,也可以不输入密码,直接按回车。那么在push的时候就不需要输入密码,直接提交到GitHub上
第三步:添加SSH Key到github上面去
登上GitHub,打开Settings, SSh and GPG keys页面然后,点击new SSH Key ,天上任一Title,在Key文本框里把id_rsa.pub的内容复制到这里。
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
在github上创建一个仓库,把本地仓库的内容推送到GitHub仓库git push 仓库名 分支
git remote add origin git@github.com:hwb5522/learn.git
git push -u origin master
以后只需要git push origin master
在github克隆远程仓库git clone
git clone git@github.com:hwb5522/gitskills.git
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
- 分支
查看分支git branch
创建分支git branch <name>
切换分支git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name> 合并某分支到当前分支
git merge <name>删除分支:
git branch -d <name>`
解决合并冲突:就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev
git stash
把当前工作现场“储藏”起来,等可以以后恢复现场后继续工作
git stash list
查看“储藏”的工作现场
恢复方法:git stash apply
恢复,在用git stash drop
删除;另一种是:git stash pop
恢复的同事吧stash内容也删除了
- 修复bug
通常创建新的bug分支进行修复,然后合并,最后删除分支;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。(commit为修改bug的分支提交修改的commit id)
- Feature分支
开发一个新功能最好新建一个分支,如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name> 强行删除。
- 多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote
或者用git remote -v
显示更详细的信息
推送分支:把该分支上的所有本地提交推送到远程库,推送时要指定分支这样,Git就会把该分支推送到远程库对应的远程分支上git push origin master
如要推送其他分支,比如dev
git push origin dev
从远程库clone时,默认情况下,只能看到本地的master分支。如果要在dev分支上开发就必须创建远程的origin的dev分支到本地,使用命令git checkout -b dev origin/dev
现在就可以在dev上继续修改然后把dev分支push到远程
- 标签管理
- 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
- 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
- 命令git tag可以查看所有标签。
- 命令git show <tagname> 查看标签的信息
- 命令git push origin <tagname>可以推送一个本地标签;
- 命令git push origin --tags可以推送全部未推送过的本地标签;
- 命令git tag -d <tagname>可以删除一个本地标签;
- 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。