- Workspace: 工作区
- Index/Stage: 暂存区
- Repository: 仓库区(或本地仓库)
- Remote: 远程仓库
目录
一、下载代码库
git clone [url] #从url克隆代码
1. 创建SSH Key
ssh-keygen -t rsa -C "[note]" -f "[file name]"
执行上面命令,会在当前目录下创建SSH Key文件。其中,
- -t: 密钥的类型。
- -C: 用于识别这个密钥的注释,可以是任何内容,不一定要是邮箱。
- -f: 创建的文件名。
eg. ssh-keygen -t rsa -C "MasonJiang" -f "id_rsa_gitee"
2. 上传SSH Key
执行第一步的命令会生成两个文件,分别是id_rsa_gitee和id_rsa_gitee.pub。将id_rsa_gitee.pub里的文本粘到相应的服务器上。比如下图是码云添加SSH Key的位置。
3. 配置本地SSH Key config
将第一步生成的两个文件,拷贝到 C:\Users\[当前电脑用户名]\.ssh\ 路径下。
新建文件config,向其中添加以下内容。
# 配置gitee.com
Host gitee.com
HostName gitee.com
IdentityFile C:\\Users\\s\\.ssh\\id_rsa_gitee
PreferredAuthentications publickey
# 配置github.com
Host github.com
HostName github.com
IdentityFile C:\\Users\\s\\.ssh\\id_rsa
PreferredAuthentications publickey
其中,
- HostName: 服务主机名
- IdentityFile: 密钥文件
- PreferredAuthentications: 优先使用SSH
- User: 用户名(可忽略)
4. 测试连接
ssh -vT git@[example.com]
用具体的服务域名替换掉[example.com]。执行后有successfully就表示连接成功,并在C:\Users\[当前电脑用户名]\.ssh\ 路径下生成一个known_hosts的文件(如果文件已经存在则不会再生成)。其中
- -T: 不显示终端,只显示连接成功信息。(可选)
- -v: 显示debug的信息。(可选)
比如
ssh -T git@gitee.com #码云
ssh -T git@gitlab.com #gitlab
ssh -T git@github.com #github
二、Git配置
git config --list #显示当前的git配置
git config -e #设置提交代码时的用户信息(包含是否忽视文件大小写等)
git config --global user.name "[name]" #设置提交时的用户名
git config --global user.email "[email address]" #设置提交时的用户邮箱
git config --global --unset user.name #移除设置的用户名
git config --global --unset user.email #移除设置的用户邮箱
git config core.ignorecase false #设置提交时区分大小写
这里要注意,如果要改变文件的大小写,除了执行设置提交时区分大小写的命令外,还要将文件删除(一定要记得先备份!!!)后再重新添加回来。否则当push到远程仓库时会在远程仓库里新增一个大小写不一样的文件或文件夹,原文件或原文件夹依然存在,其它人拉代码的时候就不一定会拉到哪个文件或文件夹里的内容了。比如下面就是个反倒,本地是将文件夹Example改成example,直接commit并push到远程仓库,会在远程仓库里新加一个example的文件夹,而不是修改原有的Example文件夹。
不管你是将要修改文件的大小写,还是悲剧已经发生在远程仓库,都可以执行以下步骤:
(1) 备件要改变大小写的文件或文件夹。(再次强调,删除之前一定要备份!!!)
(2) 用以下命令删除文件或文件夹 (如果直接操作文件或文件夹,删除后要执行git add将改动加入到暂存区,否则下一步把文件添加回来后还是没有效果)。
git rm [file1] [file2] -rf
(效果图如下)
(3) 将第一步的备份文件或文件夹改变大小写,然后粘贴回来。执行git add将改动加入到暂存区。再commit并push到远程仓库后,就是我们想要的结果了。(效果图如下)
三、分支
git branch #列出所有本地分支
git branch -r #列出所有远程分支
git branch -a #列出所有本地和远程分支
git branch [branch-name] #新建一个分支,但依然停留在当前分支
git checkout -b [branch-name] #新建一个分支,并切换到该分支
git branch [branch-name] [commit] #新建一个分支,并指定commit
git branch --track [branch-name] [remote-branch-name] #新建一个分支,并与指定远程分支建立追踪关系
git checkout [branch-name] #切换到指定分支
git checkout - #跳回之前分支
git branch -d [branch-name] #删除分支
git push origin -d [branch-name] #删除远程分支
四、文件操作
git status #显示有变更的文件
git add [file/dir] #添加指定文件或文件夹到暂存区
git add . #添加当前目录及子目录的所有文件到暂存区
git reset HEAD [file/dir] #将指定文件/文件夹从暂存区移回工作区
git checkout [file/dir] #撤销对文件/文件夹内容的修改
git rm [file/dir] #删除指定文件/文件夹
git mv [old-name] [new-name] #重命名文件或文件夹。如果是改变文件名大小写,则参考第二节内容。
git diff #显示暂存区/工作区与上次commit的差异。
git diff [file1] [file2] #显示指定文件与上次commit的差异
当用git diff命令,修改文件太长,会进行vim模式。有两种方式退出:
- 按住shift键,再连按两次z
- 输入(包括冒号) :wq
1. git stash
git stash save '[stash name]' #将所有文件存储到堆栈
git stash list #查看堆栈有哪些stash
git stash show stash@{$num} #显示stash@{$num}存储了哪些文件,如果不指定则为stash@{0}
git stash show stash@{$num} -p #显示stash@{$num}存储的文件的具体改动,如果不指定则为stash@{0}
git stash apply stash@{$num} #应用stash@{$num}存储的文件,如果不指定则为stash@{0}
git stash drop stash@{$num} #删除stash@{$num}存储的文件,如果不指定则为stash@{0}
git stash pop #等同于git stash apply + git stash drop
git stash clear #删除所有stash
另外,需要注意的是: 新增的文件,直接执行stash是不会被存储的。需要添加到暂存区后,再执行stash。
五、提交/撤销
git commit -m '[message]' #提交代码
git commit --amend -m '[message]' #修改上次commit的message
1. git reset
git reset --soft HEAD^ #回退到上个版本,回退掉的commit改动全部保留到暂存区,本地暂存区和工作区内的内容不变。如果commit内的改动和暂存区里有相同的文件,会保留暂存区里的文件。
git reset --keep HEAD^ #回退到上个版本,回退掉的commit改动全部丢弃,但本地暂存区和工作区内的内容不变。
git reset --hard HEAD^ #回退到上个版本,回退掉的commit改动全部丢弃,并且本地暂存区和工作区内的内容也丢弃。
git reset --hard HEAD~3 #回退到前3次提交之前,以此类推,回退到n次提交之前
git reset --hard [commit-id] #退到/进到提交commit,commit-id即为sha码
模式 | commit | commit中的改动 | 当前暂存区和工作区里的改动 |
--soft | 回退到指定版本 | 保留到暂存区 (如果和当前暂存区里有相同的文件, 以当前暂存区里的文件为主。) | 保留 |
--keep | 回退到指定版本 | 丢弃 | 保留 |
--hard | 回退到指定版本 | 丢弃 | 丢弃 |
六、代码拉取/提交
git pull #从远程仓库拉取当前分支的代码
git pull origin [remote branch name] #从远程仓库拉取指定分支名的代码
git push #将本地仓库的commit推送到远程仓库
git push origin [remote branch name] #将本地仓库的commit推送到远程仓库指定的分支
git push origin [remote branch name] -f #强制将本地仓库的commit推送到远程仓库指定分支
1. git rebase
git rebase -i [source branch name] #当前为target branch,将source branch的内容rebase到target branch。
其中,
- -i: 指交互模式。就是说你可以干预rebase这个事务的过程,包括设置commit message、暂停commit等等。
比如当前分支为new-branch,源分支为base-branch,具体操作如下:
(1) git rebase -i base-branch
如果当前分支有多次commit,会提示在vim模式下选择commit。一般第一条commit为pick,后面的commit都为s。如果没有冲突,这一步之后就结束;否则进入第(2)步。
- p, pick - 保留该commit。
- r, reword - 保留该commit,但需要修改该commit的注释。
- e, edit - 保留该commit,但要停下来修改该提交(不仅仅修改注释)。
- s, squash - 该commit和前一个commit合并。
- f, fixup - 该commit和前一个commit合并,但不保留该提交的注释信息。
- x, exec - 执行shell命令。
- d, drop - 丢弃该commit。
下图为在vim模式下编辑提交信息。
(2) 解决冲突
下图展示了本地分支与源分支在example/git.txt这个文件上有两次冲突(分支名字后面有REBASE-i 1/2,这里的1表示当前在解决第1次冲突,2表示总共有2个冲突),所以在要重复下面的命令两次。
- git add example #在解决完冲突之后需要把文件加到暂存区。
- git rebase --continue #继续rebase操作。
2. git merge
git merge [source branch name] #当前为target branch,将source branch的内容merge到target branch。
比如当前分支为new-branch,源分支为base-branch,具体操作如下:
(1) git merge base-branch
如果没有冲突,这一步之后就结束;否则进入第(2)步。
(2) 解决冲突
下图展示了本地分支与源分支在example/git.txt这个文件上有冲突(merge只会有一次冲突)。执行以下操作就可以解决冲突。
- git add example/git.txt #在解决完冲突之后需要把文件加到暂存区。
- git commit #完成merge操作