git 相关技术

目录

1. 初始化

1. 安装

2. 生成 SSH Key

3. 设置全局变量

4. 初始化新版本库

5. 设置忽略的文件

2. 日常操作

1. 添加新文件到版本库

2.  提交

3. 撤销修改

4. 分支

5. 标签

6. 从远程库获取

7. 推入远程库

目录

1. 初始化

1. 安装

2. 生成 SSH Key

3. 设置全局变量

4. 初始化新版本库

5. 设置忽略的文件

2. 日常操作

1. 添加新文件到版本库

2.  提交

3. 撤销修改

4. 分支

5. 标签

6. 从远程库获取

7. 推入远程库

3. 常用技巧

1. 查看GitHub上项目创建时间


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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值