代码改变世界

Git常用操作笔记(待完善)

2020-02-19 22:07  Gizing  阅读(185)  评论(0编辑  收藏  举报

Git存储的是文件快照,SVN基于差异存储

1. Git安装及公钥相关

1.1 Linux安装

Ubuntu或Debian安装Git命令:sudo apt-get install git

其他Linux版本源代码安装命令:

./config
make
sudo make install

1.2 Windows安装

安装程序下载地址:msysgit

安装完成后,设置全局用户名和邮件:

git config --global user.name "your name"
git config --global user.email "xxxx@xxx.com"

1.3 公钥生成及配置

创建当前机器的SSH Key,生成过程中让输入密码时可全部回车,避免后续与远程仓库打交道输密码

ssh-keygen -t rsa -C "xxxxx@xx.xx" # 邮箱

配置:将机器的SSH Key公钥添加到Github/Gitlab等(id_rsa.pub文件内容)

测试公钥配置是否生效(以github为例)

ssh -T git@github.com # 成功时有相应反馈显示

2. 常用操作

当不清楚某条命令的具体用法和选项时,可在命令后加--help查看手册,如:

git log --help
git remote --help

2.1 创建仓库及简单提交

仓库(repository),可以理解为一个目录,Git管理目录里所有文件

  1. 将目录变成Git管理的仓库,在目录下执行git init

  2. 将工作区文件添加到缓冲区git add file_name1 file_name2

  3. 将缓冲区文件添加到仓库

    git commit -m "first commit"    # -m 是本次提交说明,"first commit"是说明内容
    git commit # 不加-m会自动打开vim令输入说明内容
    

2.2 一些常用命令

git status # 查看当前状态
git diff [file] # 查看工作区修改(-代表删掉的内容,+代表新加入的内容),file表示是否查看指定文件
git difftool -d commit_id commit_id # 使用设置好的对比工具对比两次提交点的差异
git log # 显示最近到最远的提交日志
git reset --hard commit_id # 版本回退(把HEAD指向指定commit)
git reflog  # 查看操作历史,可用来回退操作
git log -g # 同上

git remote prune origin # 更新与origin关联的所有分支关系,需要删除本地分支的话需要手动git branch -d 

2.3 分支

推荐本地分支与远程分支同名,本地分支可与远程分支不同名,但不推荐

删除分支

git branch -d dev   # 删除本地dev分支
git branch -D dev   # 强行删除本地dev分支
git push origin dev -d # 删除origin远程库上dev分支,本地不删

创建分支,可指定从某个commit切出新分支

git checkout -b dev [commit] # commit不写则默认从当前HEAD创建新分支dev

合并xx分支到当前分支

git merge xx  # Fast forward模式
git merge --no-ff dev -m "your comment"  # 禁用fast forward模式,merge时生成新的commit

拉取远程分支到本地

git fetch origin dev # dev为远程仓库的分支名,origin为远程仓库代名
git checkout -b dev origin/dev

强制用远程分支更新本地(舍弃dev本地所有修改,与远程保持一致)

git fetch origin dev # 前提是本地分支与远程分支同名
git reset --hard origin/dev

查看本地分支与远程分支的关联关系:git branch -vv

2.4 版本管理

2.4.1 撤销

修改后未add(未添加到暂存区)需要撤销时;修改后add(未commit)再次修改文件,要撤销第二次修改时

git checkout -- file  # 撤销工作区修改

修改后add(未commit),需要撤销修改

git reset HEAD file      # 将暂存区内容还原到工作区,此时工作区修改还未撤销
git checkout -- file     # 撤销工作区修改

修改后add并commit,需要撤销修改

git reset --hard HEAD^   # HEAD^代表上一个版本,HEAD^^代表上上个版本
git reset --hard commit号

2.4.2 删除文件

从仓库里删除,并不再追踪

git rm file # 从git追踪中一并删除 
git commit # 最好带上-m说明

误删(rm file),但版本库里还有,需要恢复

git checkout -- file  # 本质上是对修改的撤销

误删(git rm并且commit)就用git reset恢复

2.5 远程仓库相关

clone仓库

git clone git@host:user/path/xxx.git # host指主机地址,下载整个仓库
git clone -b 分支名 仓库地址 # 下载指定分支

已有git仓库与远程仓库建立/删除关联

git remote -v # 查看本地与远程仓库关联关系
git remote add origin git@server-name:path/repo.git # 关联repo仓库,并命名为origin
#例子,xxx是github账户名,gitname是远程仓库的名字
git remote add origin git@github.com:xxx/gitname.git  

git remote rm origin # 删除与origin的关联

推送(git push),不带任何参数则默认只推送当前分支

git push -u origin master   # -u 将本地master分支同远程master分支关联起来
git push origin dev  # 将本地dev分支推送到远程关联分支(即使当前不在dev分支),如远程分支不存在则被新建,此处忽略了远程分支名
git push [-f] # 表示强制推送,用本地覆盖远程

2.6 标签(tag)

TODO

打标签:

默认情况下,git push不会将标签推到远程仓库,可使用git push origin <tagname>推送

2.7 .gitignore文件

用处:不追踪指定文件如编译产生的二进制文件,避免手误加入导致仓库庞大

使用方法:放置在仓库根目录,与.git目录同级

语法:
TODO

2.8 git log高级用法

参考资料

2.9 git rebase

2.9.1 合并多次commit

git rebase -i start_point # start_point是开区间,即不包含

2.9.2 合并分支

相比merge,可以有一条清晰的历史线

与远程其他分支更新时

git pull --rebase origin master  # 与远程master合并时,在最新节点的基础上合入本分支的commit

2.9.3 git commit --amend

可以修改当前分支最后一次commit的信息(包括作者)

git commit --help # 查看commit的相关参数
git commit --amend --reset-author # 将最后一次commit的作者修改为当前账号(时间也修改为当前时间)
git commit --amend --author=xxx # 将最后一次commit的作者修改为xxx用户

2.10 git checkout

将部分文件回退到某个节点

git checkout commit file   # 回退后的文件会自动加入暂存区
git checkout e0c380d8 src  # 将src目录下的所有追踪文件都回退到e0c380d8节点

将文件回退到某个分支

git checkout branch file
git checkout develop src # 将src目录下的所有追踪文件都回退到develop分支的版本

3. 常用设置

设置beyond compare4

.gitconfig文件中添加命令,将bc4设置为difftool工具

[diff]
	tool = bc4
[difftool "bc4"]
    cmd = \"D:/Program Files/Beyond Compare 4/BCompare.exe\" \"$LOCAL\" \"$REMOTE\" 

.gitconfig文件中添加命令,将bc4设置为mergetool工具

[merge]
    tool = bc4
[mergetool "bc4"]
    cmd = \"D:/Program Files/Beyond Compare 4/BCompare.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"

设置完对比工具后可使用git difftool -d commit_id commit_id来对比两个提交点之间的差异,前开后闭

4. 错误处理

4.1 Filename too long

git可以创建4096长度的文件名,然而windows最多是260,管理员权限执行:

git config --global core.longpaths true