目录
目录
1. 初始化
1. 安装
在 git 官网 下载安装包并安装。
2. 生成 SSH Key
1. 启动 Git Bash 控制台(git-bash.bat)
2. 如果以前生成过 SSH Key,要先备个份:
cd ~/.ssh
mkdir key_backup
cp id_rsa* key_backup
~/.ssh 就是 C:\Users\GUOMX\.ssh
3. 生成 SSH Key:
ssh-keygen -t rsa -C "mm768528@163.com"
提示 Enter passphrase 时要输入密码,生成的 SSH Key 存放在 C:\Users\GUOMX\.ssh
4. 将 SSH Key 添加到 GitLab 账户里:点击 Settings -> SSH Keys,将 id_rsa.pub 文件中的内容粘贴到 key文本框中,点击 Add Key。
5. 第一次连接到 GitLab
ssh git@gitlab.com
输入密码后如果显示信息里包含 You've successfully authenticated 表示连接成功。之后会在 C:\Users\GUOMX\.ssh 建立一个名为 known_hosts 的文件。
3. 设置全局变量
git config --global user.name "GuoAdeline"
git config --global user.email "mm768528@163.com"
git config --global alias.st status # 配置别名,告诉git以后 st 就表示 status。很多人都用 co 表示 checkout,ci 表示 commit,br 表示 branch。
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" # 配置 git lg
配置 git lg 之后的效果:
4. 初始化新版本库
git init
会在根目录下创建一个名为 .git 的文件夹。
5. 设置忽略的文件
1. 设置项目成员都想要忽略的文件:在根目录新建一个名为 .gitignore 的文本文件
case 1. 远程仓库没有,而本地文件有
这种情况,就是远程仓库中没有,是自己在本地配置的文件不想提交,这时候只要在该文件同级目录下配置 .gitignore 文件,.gitignore 文件中加入配置文件的名字即可,例如在命令行执行
echo *.jpg>.gitignore
注意:>号左右不要有空格。
.gitignore 文件是 git 用来设置不需要提交远程仓库的文件的配置文件,但前提是远程仓库中没有对应的文件提交过。
case 2. 远程仓库有,本地文件也有但已修改
- 从远程仓库拉取下来到本地的配置文件被修改了,但修改不想被跟踪提交。文件将不再从远程仓库 pull 更新,也不再 push 推送远程仓库了。
git update-index --assume-unchanged "vue.config.js" # git关闭跟踪vue.config.js文件修改提交
git update-index --no-assume-unchanged "vue.config.js" # git打开跟踪vue.config.js文件修改提交
- 既想要远程仓库对应文件的更新,又不想要将自己本地的修改提交。不会关闭本地文件对远程仓库的跟踪,只是告诉 git 不要跟踪对本地文件的更改,pull 时会拉取最新的更新,但要更新则需要 no-skip-worktree 再 pull 拉取合并最新更新。
git update-index --skip-worktree "vue.config.js" # 关闭git跟踪本地vue.config.js文件修改
git update-index --no-skip-worktree "vue.config.js" # 打开git跟踪本地vue.config.js文件修改
2. 设置只有自己需要忽略的文件:修改 .git/info/exclude 文件,可使用正则表达式,例如:*.[oa] 等价于 *.o 和 *.a
2. 日常操作
1. 添加新文件到版本库
git add somefile.txt # 添加单个文件
git add *.txt # 添加所有 txt 文件
git add . # 包括子目录,但不包括空目录
2. 提交
git commit -m "some msg" -a # 提交所有修改
git commit -m "add msg to readme.txt" readme.txt # 提交单个文件
git commit -C head -a --amend # 增补提交,不会产生新的提交记录
git --amend 可以理解成对最后一次提交做修正(前提是最后一次提交没有merge)
3. 撤销修改
- 撤销尚未 add 到缓存区的修改
git checkout -- somefile.txt # 放弃单个文件修改,注意不要忘记中间的"--",不写就成了检出分支了!
git checkout . # 放弃所有的文件修改
此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除,用暂存区中文件来覆盖工作区中的文件,相当于取消自上次执行 git add 以来的本地修改。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于 git 是未知的。自己手动删除就好了。
- 撤销尚未提交(commit)的修改
git checkout HEAD -- reademe.txt todo.txt # 撤销1、2个文件
git checkout HEAD -- *.txt # 撤销所有txt文件
git checkout HEAD . ## 撤销所有文件
- 撤销提交
方法一:git reset
git reset 的作用是修改 HEAD 的位置,即将 HEAD 指向的位置改变为之前存在的某个版本,reset 后,目标版本之后的版本不见了。
使用 git reset --hard 目标版本号 命令将版本回退:
git reset --hard HEAD~1 # 回退到HEAD之前那个版本,不会在版本库留下痕迹
git reset --hard 7ee790643c517e0dec058cb402bc02f65ac1c7dc # 回退至目标版本号
注:
- --soft:撤销commit,不撤销add
- --mixed:撤销commit,撤销add(默认)
- --hard:撤销commit,撤销add,工作区代码将丢失
使用 git push -f 提交更改。此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以要用“git push -f”强制推到远程库:
git push origin master -f # 若GitLab不允许强制变更:settings -> Repository -> Protected Branches -> [unprotect]
方法二:git revert
git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。
使用 git revert -n 版本号 反做,并使用 git commit -m 版本名 提交
git revert -n 7ee790643c517e0dec058cb402bc02f65ac1c7dc # 反做目标版本号
注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要 git add 文件名。
提交:
git commit -m "revert add text.txt"
git push origin master # 推上远程库
4. 分支
- 基础操作
git branch # 列出本地分支
git branch -a # 列出所有分支
git branch <branchname> # 基于当前分支的末梢创建新分支
git checkout <branchname> # 检出分支
git checkout -b <branchname> # 基于当前分支的末梢创建新分支并检出分支
git switch -c dev # 创建并切换到新的dev分支
git switch master # 直接切换到已有的master分支
git merge <branchname> # 合并并提交,如果发生了冲突就不会自动提交,如果冲突很多,不想立即解决它们,可以直接使用 git checkout head . 撤销
git cherry-pick 7ee790643c517e0dec058cb402bc02f65ac1c7dc # 挑选某次提交进行合并
git branch -m <branchname> <newname> # 重命名,不会覆盖已存在的同名分支
git branch -M <branchname> <newname> # 重命名,会覆盖已存在的同名分支
git branch -d <branchname> # 删除分支,如果分支没有被合并会删除失败
git branch -D <branchname> # 删除分支,即使分支没有被合并也照删不误
- cherry-pick
git cherry-pick 可以选择某一个分支中的一个或几个 commit(s) 来进行操作
git cherry-pick <commitID> # 单独合并一个提交
git cherry-pick -x <commitID> # 同上,不同点:保留原提交者信息
git cherry-pick commit1..commit100 # 把1到100之间(左开右闭,不包含commit1)的提交cherry-pick到当前分支
git cherry-pick commit1^..commit100 # 有”^”标志的表示把之间(闭区间,包含commit1)的提交cherry-pick到当前分支
git cherry-pick dev # 将dev分支的最近一次提交,转移到当前分支。
git cherry-pick 命令的常用配置项如下:
-e,--edit
打开外部编辑器,编辑提交信息。
-n,--no-commit
只更新工作区和暂存区,不产生新的提交。
-x
在提交信息的末尾追加一行 cherry picked from commit ... ,方便以后查到这个提交是如何产生的。
-s,--signoff
在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。
-m parent-number,--mainline parent-number
如果原始提交是一个合并节点,来自于两个分支的合并,那么 cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。
-m 配置项告诉 Git,应该采用哪个分支的变动。它的参数 parent-number 是一个从1开始的整数,代表原始提交的父分支编号。
$ git cherry-pick -m 1 <commitHash>
上面命令表示,cherry pick 采用提交 commitHash 来自编号1的父分支的变动。
一般来说,1号父分支是接受变动的分支,2号父分支是作为变动来源的分支。
如果操作过程中发生代码冲突, cherry pick 会停下来,让用户决定如何继续操作。
(1)--continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 cherry pick 过程继续执行。
$ git cherry-pick --continue
(2)--abort
发生代码冲突后,放弃合并,回到操作前的样子。
(3)--quit
发生代码冲突后,退出 cherry pick,但是不回到操作前的样子。
- 删除分支
现在dev分支上,想删除dev分支
1 先切换到别的分支: git checkout master
2 删除本地分支: git branch -d dev
3 如果删除不了可以强制删除,git branch -D dev
4 有必要的情况下,删除远程分支(**慎用**):git push origin --delete dev
5 再从公用的仓库fetch代码:git fetch origin dev20181018:dev20181018
6 然后切换分支即可:git checkout dev20181018
5. 标签
发布一个版本时,通常先在版本库中打一个标签(tag),相当于是版本库的快照,也就是指向某个 commit 的指针。
git tag <tagname> <commit-id> # 默认为HEAD,也可以指定一个commit id
git tag # 查看所有标签,按字母排序
git show <tagname> # 查看标签信息
git tag -a <tagname> -m 'messages' # 创建一个带附注的标签
git tag -s <tagname> -m 'messages' # 创建一个带 gpg 签名的标签
git push origin <tagname> # 推送一个本地标签
git push origin --tags # 推送全部未推送过的本地标签
git tag -d <tagname> # 删除一个本地标签
git push origin :refs/tags/<tagname> # 删除一个远程标签
6. 从远程库获取
- 获取但不合并
git fetch origin # origin是远程库的默认别名
- 获取并合并到当前本地分支
git pull # 等价于git pull origin
使用上述命令需要在 .git/config 文件中配置:
branch.master.remote=origin
branch.master.merge=refs/heads/master
如果使用了 git clone 克隆远程库会自动添加这个配置。
7. 推入远程库
git push origin master
参考:Git常用命令
3. 常用技巧
1. 查看GitHub上项目创建时间
查看GitHub上项目创建时间,最近一次更新时间,可以使用Github提供的API,支持在线访问
API格式:
https://api.github.com/repos/{:owner}/{:repository}