Git使用笔记

Catalogue   

基本概念

  • Working Space/Working Directory:工作区/工作目录,平时存放项目代码的地方
  • Index/Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Local Repository:本地仓库
  • Stash:用于保存工作区的临时状态,方便后续恢复
  • Remote Repository:远程仓库

基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
git init   #  输出 Initialized empty Git repository in .git/    建立空仓库
git add . #添加到仓库 把所有修改提交到暂存区(Stage)
git commit -m "提交注释" #提交到仓库 把暂存区的所有修改提交到分支
git push remote_branch local_branch #将本地库提交到远程库
git status #查看修改状态

git log #显示从最近到最远的提交日志
git log -2: #查看最近几条记录

git clone git@github.com:xxx/gitskills.git #克隆仓库

#checkout 检查工作目录代码与本地仓库中的代码的差异
git checkout -b dev #创建并切换分支,相当于下面的两句
git branch experimental #创建分支
git checkout experimental #切换到分支



git fetch -u origin master #拉取远程仓库名为origin的master分支代码到本地仓库,并不修改本地工作目录的代码,如果要修改,则进行git merge变更合并

#merge 将远程仓库的变更,更新到本地工作目录中
git merge 分支名 #合并分支到当前分支上

#git pull相当于git fetch + git merge

#git pull --rebase 相当于 git fetch + git rebase

#remote 用于管理远程仓库
git remote -v #查看现有的远程仓库
#添加一个远程仓库
git remote add <仓库名字> <仓库的URL>
git remote add pb git://github.com/paulboone/ticgit.git #添加一个远程仓库 并用pb命名。
git remote rm paul #删除远程仓库
git remote rename pb paul #重名远程仓库 本地也会跟着修改
git remote set-url origin xxx.git # 修改远程仓库


#git push -u <远程仓库名字> <远程仓库的某一分支名字>
git push -u test mater #将本地仓库的变更推送远程仓库的master分支
git push origin 标签名 #推送标签到远程仓库
git push origin --tags #推送所有标签到远程仓库
git push origin :refs/tags/标签名 #从远程仓库中删除标签
git push origin --delete <branchname> #删除远程分支
git push origin :<branchName> #删除远程分支



#暂存操作:
git stash 暂存当前修改
git stash apply 恢复最近的一次暂存
git stash pop 恢复暂存并删除暂存记录
git stash list 查看暂存列表
git stash drop 暂存名(例:stash@{0}) 移除某次暂存
git stash clear 清除暂存

#回退操作:
#Git服务有一个叫HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本。
#git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。
#虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!
#为了撤销更改并分享给别人,我们需要使用 git revert。新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

git reset --hard HEAD^ #回退到上一个版本
git reset --hard ahdhs1(commit_id) #回退到某个版本,撤销git commit,撤销git add,删除编辑器改动代码
git reset --soft (commit id) #撤销git commit,不撤销git add,保留编辑器改动代码
git reset --mixed (commit id) #撤销git commit,撤销git add,保留编辑器改动代码
git checkout -- file #撤销修改的文件(如果文件加入到了暂存区,则回退到暂存区的,如果文件加入到了版本库,则还原至加入版本库之后的状态)
git reset HEAD file #撤回暂存区的文件修改到工作区
git revert HEAD



#标签操作:
#tag的作用是方便用户回滚操作,只需要记住tag的名字就能迅速回滚
git tag #列出所有标签列表,可以按照标签进行checkout
git tag 标签名 #添加标签(默认对当前版本)
git tag 标签名 commit_id #对某一提交记录打标签

git tag -a 标签名 -m '描述' #创建新标签并增加备注
git show 标签名 #查看标签信息
git tag -d 标签名 #删除本地标签


#git rm提交删除文件的变更到暂存区

git diff test.txt 本地工作目录中到文件与本地仓库中的文件对比


# 时光机,查看提交记录
git reflog

# 取消xxx的修改内容
git restore xxx

Git分支管理

master分支一般用于发布新版本,dev分支用于开发,每个人从dev分支创建自己的个人分支,开发完合并到dev分支,最后合并到master分支。

1
2
3
4
5
6
7
8
9
10
11
12
git branch   查看所有已存在的分支
git branch -a 查看远程分支
git branch -v 查看所有分支的最后一次操作
git branch -vv 查看当前分支
git brabch -b 分支名 origin/分支名 //创建远程分支到本地
git branch --merged //查看别的分支和当前分支合并过的分支
git branch --no-merged //查看未与当前分支合并的分支
git branch -d xxx 删除本地分支
git branch -D crazy-idea 强制删除分支

git merge 功能1 #合并功能1分支到当前分支
git branch -d 功能1 # 删除功能1分支(当前不能在功能1分支、删除的是本地分支)

gitignore文件

用来存储不需要进行版本管理的文件

文件匹配规则

1
2
3
4
5
*.log  # 表示忽略项目中所有以.log结尾的文件
123?.log # 忽略所有以123加任意一个字符,且以.log结尾的文件
/error.log # 忽略根目录下的error.log文件
**/java/ # 忽略所有java目录下的所有文件
!/error.log # 表示在前面的匹配规则中,被忽略了的文件,你不想它被忽略,那么就可以在文件前面加叹号

拉取体积很大的仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

git clone --depth 1 仓库地址
git fetch --unshallow

#以上方式只有主分支

#拉取所有分支
git fetch -all


#拉取某一个分支
git branch -a
git remote set-branches origin '远程分支名称’
git fetch --depth 1 origin 远程分支名称
git checkout ‘远程分支名称’


仓库之间的迁移

整个仓库迁移

1
2
3
git clone --bare 旧仓库地址
git push --mirror 新仓库地址

迁移一个分支

1
2
git remote add 本地分支 新仓库地址  //关联远程分支
git push 远程分支 本地分支 //提交分支

SourceTree

Could not read from remote repository解决办法

1
2
3
4
5
cd ~/.ssh
# 确认将公钥添加到服务器
# 验证
ssh -T git@github.com
ssh-add id-rsa

Sourcetree使用

Permission denied错误

1
2
3
4
5
6
7
git@github.com: Permission denied (publickey).

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

and the repository exists.

Mac每次重启之后就无法在Sourcetree连接服务器了,原因是私钥没有添加到钥匙链中,需要执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ssh-add参数
-D:删除ssh-agent中的所有密钥.
-d:从ssh-agent中的删除密钥
-e pkcs11:删除PKCS#11共享库pkcs1提供的钥匙。
-s pkcs11:添加PKCS#11共享库pkcs1提供的钥匙。
-L:显示ssh-agent中的公钥
-l:显示ssh-agent中的密钥
-t life:对加载的密钥设置超时时间,超时ssh-agent将自动卸载密钥
-X:对ssh-agent进行解锁
-x:对ssh-agent进行加锁

ssh-add -K !/.ssh/id_rsa

#查看ssh-agent中的密钥
ssh-add -l

移动HEAD

1
2
3
4
5
6
7
8
# 切换到指定id
git checkout commit_id
# 指定提交
git branch -f branch_name HEAD~1
# 上一个提交
git branch -f branch_name HEAD^