这是一篇入门级使用指南,更多详细的请参考 Git 官网电子书。
在这里将列举一些常用命令和场景解决方案,欢迎大家补充学习。
在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题:
- 代码被覆盖或丢失
- 代码写的不理想希望还原之前的版本
- 希望知道与之前版本的差别
- 是谁修改了代码以及为什么修改
- 发版时希望分成不同的版本(测试版、发行版等)
因此,我们希望有一种机制,能够帮助我们:
- 可以随时回滚到之前的版本
- 协同开发时不会覆盖别人的代码
- 留下修改记录,以便随时查看
- 发版时可以方便的管理不同的版本
一个标准的版本控制系统 Version Control System (VCS),通常需要有以下功能:
- 能够创建 Repository (仓库),用来保存代码
- 协同开发时方便将代码分发给团队成员
- 记录每次修改代码的内容、时间、原因等信息
- 能够创建 Branch (分支),可以根据不同的场景进行开发
- 能够创建 Tag (标签),建立项目里程碑
版本控制系统发展至今有几种不同的模式:
Local VCS
本地使用 复制/粘贴
的方式进行管理,缺点是无法协同开发
Centralized VCS (Lock,悲观锁)
中央集中式版本控制系统团队共用仓库,当某人需要编辑文件时,进行锁定,以免其他人同时编辑时造成冲突。缺点是虽然避免了冲突,但不是很方便。其他人需要排队才能编辑文件,如果有人编辑了很久或是忘记解锁就会造成其他人长时间等待的情况。
Centralized VCS (Merge,乐观锁)
中央集中式版本控制系统团队共用仓库,不采用悲观锁方式来避免冲突,而是事后发现如果别人也修改相同文件(冲突),再进行手动修改解决。有很多 VCS 属于这种类型,如:CVS,Subversion,Perforce 等
中央集中式版本控制系统的共同问题是,做任何操作都需要和服务器同步,如果服务器宕机则会造成无法继续工作的窘迫。
Distributed VCS
分布式版本控制系统,本地也拥有完整的代码仓库,就不会出现上述集中式管理的问题,即使没有网络,依然可以 commit
和看 log
,也无需担心服务器同步问题。如:Git,Mercurial,Bazaar 等就属于分布式版本控制系统。缺点是功能比较复杂,上手需要一定的学习时间。
- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
- Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
- Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
-
Git 官网下载地址:Git 版本管理工具
-
客户端推荐:SourceTree,软件安装跳过注册,请参考这里
一图胜千言
推荐一个不错的可视化工具:Git Cheat Sheet
设置提交者姓名
$ git config --global user.name "John Doe"
设置提交者邮箱
$ git config --global user.email johndoe@example.com
查看配置列表
$ git config --list
在指定目录创建仓库,如果没有指定目录名将在当前目录创建仓库
$ git init [目录名]
# 当前文件夹初始化
$ git init .
# 指定目录
$ git init frank
从指定地址克隆仓库,若不指定目录名
将默认创建与远程同名目录
$ git clone <远程仓库地址> [目录名]
# 不想创建目录,目录名为 . ,直接加在内容到当前目录下
$ git clone https://github.com/frank-lam/2019_campus_apply.git .
将文件或目录中已修改的代码添加追暂存区
$ git add <目录名|文件名>
提交暂存区内容
$ git commit -m "<注释>"
查看仓库状态
$ git status
比对当前内容和暂存区内容
$ git diff
比对当前内容和最近一次提交
$ git diff HEAD
比对当前内容和倒数第二次提交
$ git diff HEAD^
比对最近两次提交
$ git diff HEAD^ HEAD
查看提交历史
$ git log --oneline
打印为单行log
$ git log --oneline
打印所有记录(忽略HEAD的位置)
$ git log --all
打印示意图(忽略HEAD的位置)
$ git log --graph
查看所有分支
$ git branch
有分支:创建分支,无分支:列出所有分支
$ git branch [分支]
切换至分支
$ git checkout <分支>
创建并切换至分支分支
$ git checkout -b <分支>
将分支与当前分支合并
$ git merge <分支>
拉取远程仓库
$ git pull
推送至远程仓库
$ git push <远程仓库> <分支>
新增远程仓库 origin
$ git remote add origin https://xxx.git
修改远程仓库 origin
$ git remote set-url origin https://xxx.git
Git提示:up-to-date,但未得到删除的文件
原因:当前本地库处于另一个分支中,需将本分支发 Head 重置至 master
$ git checkout master
$ git reset --hard
git 强行 pull 并覆盖本地文件
$ git fetch --all
$ git reset --hard origin/master
$ git pull
应用场景:
- 当正在 dev 分支上开发某个项目,这时项目中出现一个 bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用 git stash 命令将修改的内容保存至堆栈区,然后顺利切换到 hotfix 分支进行 bug 修复,修复完成后,再次切回到 dev 分支,从堆栈中恢复刚刚保存的内容。
- 由于疏忽,本应该在 dev 分支开发的内容,却在 master 上进行了开发,需要重新切回到 dev 分支上进行开发,可以用 git stash 将内容保存至堆栈中,切回到 dev 分支后,再次恢复内容即可。
总的来说,git stash 命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash 中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash 作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。首先你要确认一下本机是否已经有一个公钥。
SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:
$ cd ~/.ssh
$ ls
authorized_keys2 id_dsa known_hosts config id_dsa.pub
看一下有没有id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有 .pub 后缀的文件就是公钥,另一个文件则是密钥。
假如没有这些文件,甚至连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在 Linux/Mac 系统上由 SSH 包提供,而在 Windows 上则包含在 MSysGit 包里:
$ ssh-keygen -t rsa -C "your_email@youremail.com"
Creates a new ssh key using the provided email # Generating public/private rsa key pair.
Enter file in which to save the key (/home/you/.ssh/id_rsa):
直接按Enter就行。然后,会提示你输入密码,如下(建议输一个,安全一点,当然不输也行,应该不会有人闲的无聊冒充你去修改你的代码):
Enter same passphrase again: [Type passphrase again]
完了之后,大概是这样:
Your public key has been saved in /home/you/.ssh/id_rsa.pub.
The key fingerprint is: # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@youremail.com
到此为止,你本地的密钥对就生成了。
- 查看你生成的公钥:
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0X6L1zLL4VHuvGb8aJH3ippTozmReSUzgntvk434aJ/v7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8vR3c8E7CjZN733f5AL8uEYJA+YZevY5UCvEg+umT7PHghKYaJwaCxV7sjYP7Z6V79OMCEAGDNXC26IBMdMgOluQjp6o6j2KAdtRBdCDS/QIU5THQDxJ9lBXjk1fiq9tITo/aXBvjZeD+gH/Apkh/0GbO8VQLiYYmNfqqAHHeXdltORn8N7C9lOa/UW3KM7QdXo6J0GFlBVQeTE/IGqhMS5PMln3 admin@admin-PC
-
登陆你的 GitHub 帐户。点击你的头像,然后
Settings -> 左栏点击 SSH and GPG keys -> 点击 New SSH key
-
然后你复制上面的公钥内容,粘贴进“Key”文本域内。 title域,自己随便起个名字。
-
点击 Add key。
完成以后,验证下这个key是不是正常工作:
$ ssh -T git@github.com
Attempts to ssh to github
如果,看到:
Hi xxx! You've successfully authenticated, but GitHub does not # provide shell access.
恭喜你,你的设置已经成功了。
使用命令 git remote -v 查看你当前的 remote url
$ git remote -v
origin https://github.com/someaccount/someproject.git (fetch)
origin https://github.com/someaccount/someproject.git (push)
如果是以上的结果那么说明此项目是使用https协议进行访问的(如果地址是git开头则表示是git协议)
你可以登陆你的github,就像本文开头的图例,你在上面可以看到你的ssh协议相应的url,类似:
复制此ssh链接,然后使用命令 git remote set-url 来调整你的url。
$ git remote set-url origin git@github.com:someaccount/someproject.git
然后你可以再用命令 git remote -v 查看一下,url是否已经变成了ssh地址。
然后你就可以愉快的使用 git fetch, git pull , git push,再也不用输入烦人的密码了
利用Git版本管理将只修改过的文件上传到FTP服务器 支持SFTP协议 - 吕滔博客 https://lvtao.net/tool/gitftp.html
git学习:关于origin和master - mashiqi - 博客园 https://www.cnblogs.com/mashiqi/p/6002671.html
Git 里面的 origin 到底代表啥意思? - Not Only DBA. - CSDN博客 https://blog.csdn.net/u011478909/article/details/77683754