Git学习笔记

新建git项目

在一个目录下执行

git init

克隆git项目

在一个目录下执行

git clone [ssh/https]address

管理修改

将文件修改添加到暂存区

git add filename

将暂存区的修改提交到本地仓库

git commit -m 'commitMessage' [filename]

每次修改完要先add到暂存区,然后commit才能把你修改的东西提交的本地仓库

提交信息规范

commit message格式

<type>(<scope>): <subject>
type(必须)

用于说明git commit的类别,只允许使用下面的标识。

feat:新功能(feature)。

fix/to:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。

  • fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
  • to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix

docs:文档(documentation)。

style:格式(不影响代码运行的变动)。

refactor:重构(即不是新增功能,也不是修改bug的代码变动)。

perf:优化相关,比如提升性能、体验。

test:增加测试。

chore:构建过程或辅助工具的变动。

revert:回滚到上一个版本。

merge:代码合并。

sync:同步主线或分支的Bug。

scope(可选)

scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

例如在Angular,可以是location,browser,compile,compile,rootScope, ngHref,ngClick,ngView等。如果你的修改影响了不止一个scope,你可以使用*代替。

subject(必须)

subject是commit目的的简短描述,不超过50个字符。

建议使用中文(感觉中国人用中文描述问题能更清楚一些)。

  • 结尾不加句号或其他标点符号。
  • 根据以上规范git commit message将是如下的格式:
fix(DAO):用户查询缺少username属性 
feat(Controller):用户查询接口开发

查看工作区和暂存区的不同

git diff [filename]

查看暂存区和版本库的不同

git diff --cached [filename]

删除修改

在文件已经加入版本库的情况下

  1. 如果文件修改后没有add进暂存区,我们可以用

    git checkout -- filename
    

    取消工作区的修改,恢复到和版本库一摸一样的状态

  2. 如果文件修改后已经add进暂存区了,我们可以用

    git reset HEAD filename
    

    取消暂存区的修改,恢复到工作区有修改的状态,这是查看git status

    会看到

    图 6

    要撤销工作区的修改就用上面的checkout

  3. 如果文件修改后已经commit到了本地仓库,那么我们只能使用版本回退了

    git reset --hard [commitID]
    

    commitID可以通过git log 或者 git reflog查看。git log 查看当前版本的所有commit,git reflog查看所有commit,所以回退到了老版本后想回到新版本后得先git reflog 查看新版本的commitID

在文件没有加入版本库的时候

这种情况一般是新生成的文件,工作区可以任意编辑,因为版本库中没有,所以不需要checkout(checkout在没有add的时候恢复至版本库状态)

图 7

如果add进了暂存区,此时和上面一样,可以使用

git resset HEAD filename

恢复至工作区有修改的状态

图 8

图 9

删除文件

如果文件已经处于tracked状态(已经被add了),当你要删除文件的时候,可以采用命令:

rm filename

这个时候(也就是说这个时候只执行了rm test.txt)有两种情况

第一种情况:的确要把test.txt删掉,那么可以执行

git rm test.txt 或者  git add test.txt
git commit -m "remove test.txt"

然后文件就被删掉了,这种情况想恢复只能用版本回退了,但是之前的版本也没有提交这个文件,那这个就永远消失了

第二种情况:删错文件了,不应该删test.txt,注意这时只执行了rm test.txt,还没有提交,所以可以执行

git checkout test.txt

将文件恢复。

并不是说执行完git commit -m "remove test.txt"后还能用checkout恢复,commit之后版本库里的文件也没了,自然没办法用checkout恢复,而是要用其他的办法(版本回退)

远程仓库

检测是否能ssh登录远程仓库

ssh -T git@github.com

图 10

添加远程仓库

git remote add origin git@github.com:username/reponame.git

查看远程仓库

git remote

抓取/合并远程仓库

git fetch origin
git merge origin/master

推送到远程仓库

git push -u origin master

-u 表示把本地的master分支和远程仓库origin的master分支关联

后面就可以用

git push origin master

删除远程仓库关联

git remote rm origin

分支管理

新建并切换分支

git checkout -b dev

和下面作用一样

git branch dev
git checkout dev

查看分支

图 11

*表示当前所在分支

分支操作

和上面的文件修改一个意思,只不过上面默认是在master分支操作

合并

在dev分支下执行文件修改,add、commit操作不会影响到master分支,dev开发完成之后可以切换到master分支,执行合并操作

git merge dev

删除分支

git branch -d dev

注意:在任何一条分支上做的修改必须要commit到本地仓库在能算作在dev分支上的一个版本,否则切换到别的分支,别的分支仍然能看到修改没有被添加到暂存区或者没有提交到本地仓库,别的分支可以继续处理这个修改,有一个办法是git stash保留当前分支上的工作内容,这样切到别的分支上git status就没有要处理的修改了

解决冲突

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容

图 12

图 13

<<<<和=====之间是HEAD(当前分支)的内容,=====和>>>>>之间是feature1分支的内容

下图是手动修改后的冲突文件

查看分支合并情况

git log --graph

bug分支

保留现场

git stash

然后切到有bug的分支上,新建一个分支,修复好后merge到出现bug的分支上,然后查看保存的工作现场

git stash list

恢复现场有两种办法:

git stash pop

pop会同时恢复现场和删除保存的工作现场

也可以指定恢复现场

图 14

git stash apply stash@{0}

然后删除分支

git stash drop stash@{0}

复制提交

比如上面bug分支提交了一个修改之后merge到了master分支,我们正在开发的dev分支也有这个bug,我们可以把bug分支提交的修改复制到dev分支

git cherry-pick commitID

commitID通过git log查看

推送分支

git push origin branchName

多人协作

  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

代理

设置代理

git config --global http.proxy socks5://127.0.0.1:7890
git config --global https.proxy socks5://127.0.0.1:7890

后面的端口是你的梯子监听的端口(clash默认7890)

如果是在wsl2中使用,请看WSL2.md中的代理配置

https代理存在一个局限,那就是没有办法做身份验证,每次拉取私库或者推送代码时,都需要输入github的账号和密码,非常痛苦。
设置ssh代理前,请确保你已经设置ssh key。可以参考在 github 上添加 SSH key 完成设置更进一步是设置ssh代理。只需要配置一个config就可以了。

# Linux、MacOS
vi ~/.ssh/config
# Windows 
到C:\Users\your_user_name\.ssh目录下,新建一个config文件(无后缀名)

将下面内容加到config文件中即可

对于windows用户,代理会用到connect.exe,你如果安装了Git都会自带connect.exe,如我的路径为C:\APP\Git\mingw64\bin\connect

#Windows用户,注意替换你的端口号和connect.exe的路径
ProxyCommand "C:\APP\Git\mingw64\bin\connect" -S 127.0.0.1:51837 -a none %h %p

#MacOS用户用下方这条命令,注意替换你的端口号
#ProxyCommand nc -v -x 127.0.0.1:51837 %h %p

Host github.com
  User git
  Port 22
  Hostname github.com
  # 注意修改路径为你的路径
  IdentityFile "C:\Users\Your_User_Name\.ssh\id_rsa"
  TCPKeepAlive yes

Host ssh.github.com
  User git
  Port 443
  Hostname ssh.github.com
  # 注意修改路径为你的路径
  IdentityFile "C:\Users\Your_User_Name\.ssh\id_rsa"
  TCPKeepAlive yes

保存后文件后测试方法如下,返回successful之类的就成功了

# 测试是否设置成功
ssh -T git@github.com

取消代理

git config --global --unset http.proxy
git config --global --unset https.proxy

github搜索命令

仓库搜索

in:name example 名字中有“example”

in:readme example readme中有“example”

in:description example 描述中有“example”

stars:>1000 star>1000

forks:>1000 fork>1000

pushed:>2019-09-01 2019年9月1日后有更新的

language:java 用Java编写的项目

https://docs.github.com/en/search-github/searching-on-github/searching-for-repositories

issue搜索

java in:title,body,comments 搜索标题中内容中评论中包含java的issue

https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests

零碎

已经提交的文件取消追踪

先修改.gitignore

git rm -r --cached .

git add .

git commit -m 'update .gitignore'