GIT学习笔记

    xiaoxiao2021-12-01  29

    官网: https://git-scm.com/ GIT和SVN相同的地方: 跟踪所有文件的改动历史 只能跟踪文本文件的改动详情,无法跟踪二进制文件(比如word、PPT、Excel、图片)的改动详情 GIT和SVN的区别: 所有机器上的版本库都是平等的,没有主次之分 两个用户可以互相合并对方的代码,不用通过中央库(不过一般都会使用中央库) GIT使用SHA1作为版本号,SVN使用递增的整数作为版本号 GIT有暂存区,SVN则是直接提交 GIT切换分支很方便,SVN比较麻烦 操作流程: 工作区、版本库,add、commit。其中,stage(应该是“筹划”提交的意思)为暂存区或叫index: 注:每次修改完之后,都要add到stage之后,才可以被commit进分支库中。 如果对同一个文件做了一次修改之后,add,然后再修改一次,这时候commit只会提交第一次修改。第二次修改还得add之后再commit才会被提交。 安装:(略) Linux:检查git是否已经安装:git Windows: 命令行工具:https://git-for-windows.github.io/ 基于上面这个命令行工具的乌龟(类似于SVN的那个工具):https://tortoisegit.org/ 或:图形化管理工具:SourceTree(需要注册,比较麻烦) Repository(版本库、仓库): 操作系统中的一个目录,这个目录里面的所有文件都可以被git管理起来,每个文件的修改、删除都能被git跟踪和还原。 创建仓库: mkdir my-repo cd my-repo git init 检查是否有一个.git目录(注:手动改动这目录会破坏git 仓库)。 提交文件: 添加文件到仓库(文件名可以用“.”代替,表示当前目录下的所有文件): git add <file1_name> <file2_name> ... 提交文件到仓库: git commit -m "<comments>" 查看仓库的当前状态(是否有等待提交的文件等): git status 查看文件修改的具体内容: git diff <file_name> git diff HEAD 查看提交的历史记录: git log 或:git log --pretty=oneline 查看所有操作的历史记录: git reflog (可以查询到每次操作对应的版本号) 提交到远程仓库: git push origin master 删除文件: rm <file_name> git rm <file_name> git commit -m "delete file" 撤销修改: 1、如果在本地工作区对某个文件进行修改或删除后,想撤销: git checkout -- <file_name> (让这个文件回到最近一次commit或add时的状态。相当于svn的“还原”功能。) 如果修改过的文件还没被add/rm到暂存区,则还原到和版本库一样(checkout版本库中的文件覆盖掉本地文件) 如果修改过的文件已经被add到暂存区,则还原到暂存区一样(checkout缓存区中的文件覆盖掉本地文件) 2、如果想撤销已经add到暂存区的修改(需要执行两步): git reset HEAD <file_name> (撤销暂存区中的修改) git checkout -- <file_name> (撤销工作区中的修改) 3、如果想撤销已经commit,但还没有push到远程库的修改: 需要用到“版本回退” 版本回退(相当于把HEAD指针指向另外一个位置): 回退到上个版本: git reset --hard HEAD^ 回退到指定版本号: git reset --hard 3628164(版本号的前若干位) 参数的区别: soft:HEAD updated mixed:HEAD and index updated hard:HEAD, index, and working tree updated Git分支操作: 作用: 可以在服务器创建一个自己的开发分支(跟SVN不同的是,创建分支和切换很快很方便),自己每天的代码提交到这里,等测试完之后再合并到主分支上。 创建并切换到分支"dev": git checkout -b 'dev' 此命令相当于这两条: git branch dev (创建dev分支) git checkout dev (切换到dev分支,此时HEAD改为指向dev分支) 相当于在Eclipse上的这个操作:Team -> Switch To -> New Branch... push本地分支到远程: git push origin dev 查看当前分支: git branch 切换回master分支: git checkout master 合并dev分支上的修改到当前分支上: git merge dev 如果没有冲突,就是fast-forward是合并,立刻完成。不过这种情况会让原来的dev分支从历史中抹掉。。。 如果不想这种情况发生,可以加个“--no-ff”参数: git merge --no-ff -m "merge with no-ff" dev 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 如果有冲突,合并的命令会失败。这时候编辑冲突的文件,把分支上的修改弄进去,再提交、合并,就可以成功了。 查看分支合并后的情况: git log --graph --pretty=oneline --abbrev-commit 删除dev分支: git branch -d dev 如果该分支还没被merge,尝试删除会有错误提示,需要用-D参数强行删除: git branch -D dev (不过,劳动成果一般不应该删除,留着也不碍事) 分支开发: 一般是每个人在自己的分支上开发,测试完后在合并到主分支上,主分支用于发布。如下图所示: 代码临时藏匿区stash: 如果有些代码写到一半的时候,临时有紧急任务需要切换到另外一个分支上开发(比如紧急bug修复),这时候可以把尚未写完不想提交的代码临时存到stash区中去,这样就可以腾出工作区来搞临时任务。 把工作区中未提交的代码保存到stash中: git stash git stash -u (-u表示unchecked,包括新文件。千万不能用-a,不然 .gitignore中的文件也会被弄进去) 查看工作区是不是已经清空: git status 如果已经清空,就可以checkout另外一个分支来干活了。 查看stash中是否有东西: git stash list 把stash中的内容恢复到工作区中,同时清除stash中的内容: git stash pop 这也等价于下面两条命令: git stash apply (恢复内容到过去) git stash drop (清空stash) 可以stash多次,这时候如果要恢复,就需要制定想恢复哪一个: 先用 git stash list看有哪几次stash; 然后: git stash pop stash@{id} git stash pop 等价于 git stash pop stash@{0} 查看某次stash中的详情: git stash show stash@{id} 和远程仓库之间的操作 查看远程仓库简要信息: git remote 查看远程仓库详细信息: git remote -v 把本地仓库提交到远程仓库: git push origin master git push origin dev 第一次克隆仓库到本地的时候,只会看到master分支。 如果需要添加其他分支到本地,需要另外执行(比如dev分支): git checkout -b dev origin/dev 该操作checkout dev分支,并切换过去。这样就可以对dev这个分支进行修改,再push到远程了。 如果提交的时候提示冲突,则应该先把远端的代码pull下来,解决冲突之后,再push git pull 如果此时提示“no tracking information for the current branch”,则需要关联以下本地和远程分支,然后再pull: git branch --set-upstream dev origin/dev 删除远程分支: git push origin --delete <branch_name> 标签管理: 一般发布一个版本之后,会在发布的那个commit上打一个标签,以方便以后万一需要回滚的时候根据标签号找到这个版本。 查看所有的标签(按字母排序): git tag 查看标签详情: git show v1.0 在当前的commit上打一个新的标签: git tag v1.0 对某个commit id打标签: git log --pretty=oneline --abbrev-commit git tag v0.9 <commit id> 打一个带说明文字的标签: git tag -a v1.0 -m "version 1.0 released" <commit id> 删除标签(本地): git tag -d v0.9 删除远程标签:先本地删除(上面那步),然后: git push origin :refs/tags/v0.9 推送标签到远端: git push origin v1.0 (推送某个指定的标签) git push origin --tags (推送所有的标签) Eclipse 和 Git: Eclipse中的免SSH登录设置 Window -> Preferences -> General -> Network Connections -> SSH2 如果之前已经生成公钥和私钥:“General”标签中,“Add Private Key...”选中那个私钥文件加入;然后把“.pub”文件中的内容追加到Git服务器的git用户home目录下(比如/home/git/.ssh)的authorized_keys文件中(也可以在“Key Management”中选择“Load Existing Key...,然后“Export Via SFTP...”到git服务器); 如果之前没生成公钥和私钥:选择“Key Management”标签,点击“Generate DSA Key...”或“Generate RSA Key...”,在Comment中输入一个识别标志;然后“Save Private Key...”,然后“Export Via SFTP...”到git服务器(根据提示输入 “<user>@<host>:<ssh port>”)。 Eclipse 中 checkout GIT项目: import -> Projects from Git -> Clone URI 假设项目名为“registry”、ssh用户名为git: URI: ssh://git@<host>:<ssh port>/opt/git/registry 然后输入密码 Import as general project 项目 -> 右键 -> Configure -> Convert to Maven Project... 提交新项目到GIT: 1、ssh到Git所在的LINUX,先创建仓库: su git cd /opt/git mkdir <project_name> cd <project_name> git --bare init 2、Eclipse,提交项目到服务器的仓库中: 项目 -> 右键 -> Team -> Share Project... -> GIT 勾选“Use or create repository in parent folder of project" 点击框里面的项目,点击“Create Repository”-> Next Eclipse中设置提交时使用的邮箱和用户名: Window -> Preferences -> Team -> Git -> Configuration 选择“User Settings”-> Add Entry... 添加:user.email, user.name 如果需要为某个项目特别指定:选择“Repository Settings”,在Repository下拉菜单中,选择一个项目,添加:user.email, user.name。 这个操作相当于以下命令: git config user.name "myName" git config user.email "myName@mail.com" 相关名词(按字母排序): fast-forward:快速合并,当merge一个分支的时候,如果两个分支没有冲突(CONFLICT ),就执行fast-forward merge HEAD:指向当前的工作中的分支,或其中的commit。“HEAD^”表示上一个版本,“HEAD^^”表示上上一个版本,“HEAD~100”表示上100个版本 master:我们创建版本库时,git为我们自动创建的第一个分支(一开始HEAD指向master) origin:代表被clone的远端仓库,比如“origin/master”代表远端的master分支。想向/从这个远端仓库push/pull 的时候,用 origin 指代这个远端仓库:git pull origin pull:本地 <-- 远程,如果本地落后远程,需要pull push:本地 --> 远程,如果你本地超前远程,需要push stage:筹划提交的暂存区 stash:工作区代码的临时藏匿区,用于临时保存工作现场,以便腾出工作区来修改其他代码
    转载请注明原文地址: https://ju.6miu.com/read-679314.html

    最新回复(0)