Git详解

Git是一个开源的分布式版本控制系统,常用于软件开发中对代码版本管理。Git具有版本控制、协作开发、分支管理、代码审查等功能,能够记录每次代码修改的内容和时间,并能够回滚到任意历史版本,方便团队协作和代码维护。

Git的基本概念包括仓库(repository)、分支(branch)、提交(commit)和合并(merge)。

  1. 仓库(repository)

仓库是Git存储代码的基本单位,可以理解为一个目录,其中包含着项目的所有文件和历史提交记录。Git支持本地仓库和远程仓库,本地仓库存储在开发者的计算机上,而远程仓库通常存储在云端,如GitHub、GitLab等。

  1. 分支(branch)

分支是Git非常重要的概念,它允许开发者在不影响主干代码的情况下,进行代码的修改和开发。每一个分支都是当前代码仓库中的一个拷贝,可以独立进行修改和版本管理。通过分支可以实现多人协作开发,同时也方便代码的维护和管理。

  1. 提交(commit)

提交是Git在代码仓库中保存修改后的版本。每一次提交都会记录该次修改的作者、时间和修改内容等信息。Git中的提交可以在本地进行,也可以在远程仓库进行。

  1. 合并(merge)

合并是将两个分支或多个分支的修改集成到一起,以合并后的版本作为基础版本,可以保留各自修改的内容。在多人协作开发中,合并是非常重要的操作,可以避免代码冲突和重复开发的问题。

安装git

centos 自带git

[root@git ~]# rpm -qa git
git-1.8.3.1-11.el7.x86_64

安装方法

[root@git ~]# yum install git -y

编译安装,可以安装新版本的git

Git下载地址: Releases · git/git · GitHub

# 安装依赖关系
[root@git ~]# yum install curl-devel expat-devel gettext-devel  openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker
# 编译安装 
[root@git ~]# tar -zxf git-2.0.0.tar.gz
[root@git ~]# cd git-2.0.0
[root@git ~]# ./configure --prefix=/usr/local/git # 没有文件可以略过
[root@git ~]# make  
[root@git ~]# make install  

第一次运行git前的配置

git config --global user.name "username"  #配置git使用用户
git config --global user.email "email@mail.com"  #配置git使用邮箱
git config --global color.ui true  #语法高亮
git config --list # 查看全局配置

过程

[root@gitlab ~]# git config --global user.name "newrain"  #配置git使用用户
[root@gitlab ~]# git config --global user.email "newrain@aliyun.com"  #配置git使用邮箱
[root@gitlab ~]# git config --global color.ui true  #语法高亮
[root@gitlab ~]# git config --list # 查看全局配置
user.name=newrain
user.mail=newrain@aliyun.com
color.ui=true

生成的配置文件

[root@gitlab ~]# cd
[root@gitlab ~]# cat .gitconfig 
[user]name = newrainemail = newrain@aliyun.com
[color]ui = true

获取git仓库

创建个远程裸库

创建目录
[root@yuancheng ~]# mkdir /git
[root@yuancheng ~]# cd /git
[root@yuancheng git]# ls创建裸库
[root@yuancheng git]# git init --bare ml.git
初始化空的 Git 版本库于 /git/ml.git/
[root@yuancheng git]# ls
ml.git授权
[root@yuancheng git]# chown -R git.git ml.git/

克隆远程库生成本地的仓库

如果是另外一台虚拟机,那么也得进行git配置
git config --global user.name "username"  #配置git使用用户
git config --global user.email "email@mail.com"  #配置git使用邮箱
git config --global color.ui true  #语法高亮克隆
git clone git@192.168.249.156:/git-root/shell.git

语法就是: git clone  + 你要克隆的IP:+路径

创建本地库上传至远程库

创建本地空库
[root@bendi ~]# git init cloud
初始化空的 Git 版本库于 /root/cloud/.git/
[root@bendi ~]# cd cloud/指定远程仓库
[root@bendi cloud]# git remote add origin 192.168.231.235:/git/ml.git拉取远程仓库的项目
[root@bendi cloud]# git pull  192.168.231.235:/git/ml.git
root@192.168.231.235's password: 
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 12 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
来自 192.168.231.235:/git/ml* branch            HEAD       -> FETCH_HEAD拉取成功
[root@bendi cloud]# ls
123.txt  test1.txt  test2.txt  test3.txt
[root@bendi cloud]# ls -a
.  ..  123.txt  .git  test1.txt  test2.txt  test3.txt进入仓库
[root@bendi cloud]# cd .git
[root@bendi .git]# ls
branches  description  HEAD   index  logs     refs
config    FETCH_HEAD   hooks  info   objects

在本地仓库写好数据上传至远程仓库

创建文件
[root@bendi cloud]# echo 'abc' > abc.txt上传到暂存区,object只有一个内容
[root@bendi cloud]# git add abc.txt 上传至本地仓库,object下生成内容,会有数据的信息和大小
[root@bendi cloud]# git commit -m 'abc'
[master 2530c4c] abc1 file changed, 1 insertion(+)create mode 100644 abc.txt上传至远程仓库
[root@bendi cloud]# git push origin master
root@192.168.231.235's password: 
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 246 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To 192.168.231.235:/git/ml.git3488352..2530c4c  master -> master

文件的状态变化周期

查看仓库内的上传上来的数据

上传到远程仓库的代码都在 仓库下的object目录下
[root@localhost shell.git]# cd objects/
[root@localhost objects]# ls
19  30  c4  info  pack查看结构
[root@localhost objects]# tree
.
├── 19
│   └── 0a18037c64c43e6b11489df4bf0b9eb6d2c9bf
├── 30
│   └── 934b5e119e7d374ae4bdc95f0a78529dce3378
├── c4
│   └── e7906139a764188f373d51cc188a7f578b07f5
├── info
└── pack5 directories, 3 files查看数据信息
[root@localhost objects]# git cat-file -p 190a1803
123[root@localhost objects]# git cat-file -p 30934
100644 blob 190a18037c64c43e6b11489df4bf0b9eb6d2c9bf	123.txt[root@localhost objects]# git cat-file -p  c4e790
tree 30934b5e119e7d374ae4bdc95f0a78529dce3378
author newrain <newrain@aliyun.com> 1700473533 +0800
committer newrain <newrain@aliyun.com> 1700473533 +0800123

git cat-file -p +(tree显示的内容,只需要加目录下和目录下的前几位字母即可)

git cat-file -s 查看大小

git cat-file -t 查看类型

命令之git status

git status命令用于显示工作目录和暂存区的状态。它可以告诉你哪些文件被修改过,哪些文件已经被暂存,哪些文件还没有被跟踪等等。

git常见命令操作

命令命令说明
#add添加文件内容至索引
bisect通过二分查找定位引入 bug 的变更
#branch列出、创建或删除分支
#checkout检出一个分支或路径到工作区
#clone克隆一个版本库到一个新目录
#commit记录变更到版本库
#diff显示提交之间、提交和工作区之间等的差异
fetch从另外一个版本库下载对象和引用
grep输出和模式匹配的行
#init创建一个空的
#log显示提交日志
#merge合并两个或更多开发历史
#mv移动或重命名一个文件、目录或符号链接
#pull获取并合并另外的版本库或一个本地分支
#push更新远程引用和相关的对象
rebase本地提交转移至更新后的上游分支中
#reset重置当前HEAD到指定状态
#rm从工作区和索引中删除文件
show显示各种类型的对象
#status显示工作区状态
#tag创建、列出、删除或校验一个GPG签名的 tag 对象

查看历史命令

git log #→查看提交历史记录

git log -2 #→查看最近几条记录

git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异

git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息

git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息

git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录

git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。

实践

[root@bendi cloud]# git log
commit 3450be09f9358c5852973443e2ac5b754773aa50
Author: ml <ml@11.com>
Date:   Mon Nov 20 14:08:48 2023 +08003333commit 620d9c2f7cd5c3fb2e0dc84771549cec29faf752
Author: ml <ml@11.com>
Date:   Mon Nov 20 10:10:58 2023 +0800zzzz commitcommit 63e83071fb506a671f2930038b7cfcfd24dacf9b
Author: ml <ml@11.com>
Date:   Mon Nov 20 09:30:28 2023 +0800first commit

现在有这些文件

[root@bendi cloud]# ls
test1.txt  test2.txt  test3.txt

还原历史数据

Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。

git reset --hard hash

git reset --hard HEAD^ #→还原历史提交版本上一次

git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统

会自动匹配)

测试

[root@bendi cloud]# git reset --hard 63e8307
HEAD 现在位于 63e8307 first commit查看数据
[root@bendi cloud]# ls
test1.txt

还原未来数据

什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。

git reflog #→查看未来历史更新点

测试命令

[root@bendi cloud]# git reflog
63e8307 HEAD@{0}: reset: moving to 63e8307
3450be0 HEAD@{1}: commit: 3333
620d9c2 HEAD@{2}: initial pull开始还原
[root@bendi cloud]# git reset --hard 3450be0
HEAD 现在位于 3450be0 3333查看还原数据
[root@bendi cloud]# ls
test1.txt  test2.txt  test3.txt

删除git内的文件

前提:创建一个文件,将其添加到暂存区

[root@bendi cloud]# git status 
# 位于分支 master
无文件要提交,干净的工作区
[root@bendi cloud]# echo 123 > 1.txt
[root@bendi cloud]# ls
1.txt  test1.txt  test2.txt
[root@bendi cloud]# git status 
# 位于分支 master
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	1.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)添加到暂存区
[root@bendi cloud]# git add 1.txt 
[root@bendi cloud]# git status 
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	新文件:    1.txt
#

说明:

没有添加到暂存区的数据直接rm删除即可。

已经添加到暂存区数据:

git rm --cached database

将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

git rm -f database

将文件数据从git暂存区和工作目录一起删除

由于前提文件已经添加到暂存区,因此,只是rm --cached只会删除暂存区,源文件还在

[root@bendi cloud]# git rm --cached 1.txt 
rm '1.txt'
[root@bendi cloud]# ls
1.txt  test1.txt  test2.txt
[root@bendi cloud]# git status 
# 位于分支 master
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	1.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

要将源文件以及暂存区的文件全部删除

[root@bendi cloud]# git status 
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	新文件:    1.txt
#!!!!
[root@bendi cloud]# git rm -f 1.txt 
rm '1.txt'
[root@bendi cloud]# ls
test1.txt  test2.txt

重命名暂存区数据

没有添加到暂存区的数据直接mv/rename改名即可。

已经添加到暂存区的数据

[root@bendi cloud]# ls
123.txt  aaa.txt  test1.txt[root@bendi cloud]# git mv 123.txt  456.txt
[root@bendi cloud]# ls
456.txt  aaa.txt  test1.txt
[root@bendi cloud]# git status 
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#	新文件:    456.txt
#

对已经添加到暂存区的数据,使用shell命令mv直接改名

[root@bendi cloud]# mv 2.txt  3.txt
[root@bendi cloud]# ls
3.txt
[root@bendi cloud]# git status 
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add/rm <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#	删除:      2.txt
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	3.txt

他会先删除源文件,然后在创建3.txt

分支

在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。

那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样。

查看当前在哪个分支

[root@bendi cloud]# git branch
* master

创建分支

查看远程仓库在哪个分支
[root@yuancheng ml.git]# git branch
* master本地仓库
[root@bendi cloud]# git branch
* master创建分支
[root@bendi cloud]# git branch malong 
[root@bendi cloud]# git branchmalong
* master上传分支
[root@bendi cloud]# git push origin malong
root@192.168.231.235's password: 
Total 0 (delta 0), reused 0 (delta 0)
To 192.168.231.235:/git/ml.git* [new branch]      malong -> malong查看远程仓库的分支
[root@yuancheng ml.git]# git branchmalong
* master

切换分支

[root@bendi cloud]# git branchmalong
* master准备切换分支
[root@bendi cloud]# git checkout malong
切换到分支 'malong'
[root@bendi cloud]# git branch
* malongmaster

在malong分支进行修改,master分支不会有数据

[root@bendi cloud]# git branch
* malongmaster
在马龙分支创建提交数据
[root@bendi cloud]# echo '123'> 123.txt
[root@bendi cloud]# git add 123.txt 
[root@bendi cloud]# git commit -m '123'
[malong 3488352] 1231 file changed, 1 insertion(+)create mode 100644 123.txt
[root@bendi cloud]# git push origin malong
root@192.168.231.235's password: 
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 303 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 192.168.231.235:/git/ml.git3450be0..3488352  malong -> malong
[root@bendi cloud]# ls
123.txt  test1.txt  test2.txt  test3.txt切换回master分支
[root@bendi cloud]# git checkout master
切换到分支 'master'
[root@bendi cloud]# ls
test1.txt  test2.txt  test3.txt
[root@bendi cloud]# git status 
# 位于分支 master
无文件要提交,干净的工作区

合并代码

根据之前操作,malong分支上有123.txt 而master分支没有,进行合并

进行合并
[root@bendi cloud]# git merge master malong
更新 3450be0..3488352
Fast-forward123.txt | 1 +1 file changed, 1 insertion(+)create mode 100644 123.txt[root@bendi cloud]# ls
123.txt  test1.txt  test2.txt  test3.txt
[root@bendi cloud]# git branchmalong
* master

删除分支

[root@bendi cloud]# git branchmalong
* master
[root@bendi cloud]# git branch -d malong
已删除分支 malong(曾为 3488352)。
[root@bendi cloud]# git branch
* master强制删除分支
git branch -D 加分支名

总之,Git是一个非常强大、灵活和易于使用的版本控制系统,对于软件开发中的代码管理和协作非常有用。学习Git需要掌握其基本概念和操作,包括代码仓库的创建、分支的创建和合并、提交的管理等。同时需要注意Git的一些常见问题,如代码冲突、版本回滚等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/198854.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在通用jar包中引入其他spring boot starter,并在通用jar包中直接配置这些starter的yml相关属性

场景 我在通用jar包中引入 spring-boot-starter-actuator 这样希望引用通用jar的所有服务都可以直接使用 actuator 中的功能&#xff0c; 问题在于&#xff0c;正常情况下&#xff0c;actuator的配置都写在每个项目的yml文件中&#xff0c;这就意味着&#xff0c;虽然每个项目…

数据结构【DS】栈

共享栈 共享栈的目的是什么&#xff1f; 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为&#xff1f; 存取数据时间复杂度为O(1) 共享栈如何判空&#xff1f;如何判满&#xff1f; 两个栈的栈顶指针都指向栈顶元素&#xff0c;&#x1d461;&#x1d45c;&#x1d45d;…

4-5学生分数对应的成绩

![#include<stdio.h> int main(){float score;char grade;for(int i0;i<7;i){printf("请输入成绩&#xff1a;");scanf("%f",&score);while(score>100||score<0){printf("\n输入的成绩有误&#xff0c;请重新输入&#xff1a;&quo…

【hacker送书第2期】计算机考研精炼1000题

第2期图书推荐 计算机考研难点《计算机考研精炼1000题》揭秘问答1. 为什么是1000题&#xff1f;2. 有什么优势&#xff1f;3. 编写团队水平如何&#xff1f;4. 题目及解析品质如何&#xff1f;可以试读吗&#xff1f; 参与方式 计算机考研难点 难度高&#xff01;知识点多&…

day29_Servlet

今日内容 零、 复习昨日 一、Servlet 零、 复习昨日 一、Servlet 1.1 Servlet介绍 javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应. 我们要想在服务器中写java代码来接收请求,做出响应,我们的java代码就得遵循tomca…

旋极携手西班牙SoC-e公司,为中国客户提供高效可靠TSN通讯解决方案

2023年2月&#xff0c;旋极信息与西班牙SoC-e公司正式签订战略合作协议&#xff0c;成为其在中国区重要合作伙伴。 SoC-e是一家世界领先的基于FPGA技术的以太网通讯解决方案供应商&#xff0c;是一系列IP核开发领域的先锋&#xff0c;为关键任务实施网络化、同步性和安全性提供…

深入理解 synchronized 原理

目录 一. 前言 二. Java对象的内存布局 2.1. 对象头 2.2. Mark Word 2.3. Class Metadata Pointer 2.4. Length 三. 偏向锁 3.1. 偏向锁的工作流程 3.2. 偏向失效 3.2.1. 误区一 3.3. 偏向撤销 3.3.1. 误区一 3.4. 偏向撤销的底层实现 3.5. HashCode与偏向撤销 …

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

动态库符号抢占问题分析

背景 前段时间在北汽项目中&#xff0c;遇到了一个奇怪现象&#xff0c;困扰了大家较长时间。最终在和同事的不懈努力下&#xff0c;从根因上解决了该问题&#xff0c;过程中也学习到了很多。在此&#xff0c;记录并分享&#xff0c;希望能够帮助大家。 问题描述 作为OTA服务的…

客户管理系统大盘点!推荐这五款

客户管理系统大盘点&#xff01;推荐这五款。 客户管理系统也就是CRM&#xff0c;可以说是企业刚需&#xff0c;国内外的客户管理系统也是数不胜数&#xff0c;到底有哪些是真正好用&#xff0c;值得推荐的呢&#xff1f;本文将为大家推荐这5款好用的客户管理系统&#xff1a;…

R语言:利用biomod2进行生态位建模

在这里主要是分享一个不错的代码&#xff0c;喜欢的可以慢慢研究。我看了一遍&#xff0c;觉得里面有很多有意思的东西&#xff0c;供大家学习和参考。 利用PCA轴总结的70个环境变量&#xff0c;利用biomod2进行生态位建模&#xff1a; #------------------------------------…

elasticsearch 概述

初识elasticsearch 了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索代码 在电商网站搜索商品 ELK技术栈 elasticsearc…

基于FPGA的五子棋(论文+源码)

1.系统设计 在本次设计中&#xff0c;整个系统硬件框图如下图所示&#xff0c;以ALTERA的FPGA作为硬件载体&#xff0c;VGA接口&#xff0c;PS/2鼠标来完成设计&#xff0c;整个系统可以完成人人对战&#xff0c;人机对战的功能。系统通过软件编程来实现上述功能。将在硬件设计…

centos的root密码忘记或失效的解决办法

目录 前言1 单机维护模式2 利用具有管理员权限的用户切换到root用户3 救援模式 前言 在Linux系统中&#xff0c;root用户是最高权限的用户&#xff0c;可以执行任何命令和操作。但是&#xff0c;如果我们忘记了root用户的密码&#xff0c;或者需要修改root用户的密码&#xff…

Spring Boot 项目部署方案!打包 + Shell 脚本部署详解

文章目录 概要一 、profiles指定不同环境的配置二、maven-assembly-plugin打发布压缩包三、 分享shenniu_publish.sh程序启动工具四、linux上使用shenniu_publish.sh启动程序 概要 本篇和大家分享的是springboot打包并结合shell脚本命令部署&#xff0c;重点在分享一个shell程…

万户OA upload任意文件上传漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品&#xff0c;统一的基础管理平台&#xff0c;实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台&#xff0c;将外网信息…

rabbitmq默认交换机锁绑定的routingkey-待研究

例如这个是我的一个消息队列&#xff0c;它默认绑定的交换机是 什么类型呢? 看到这个图&#xff0c;感觉应该是一个默认的交换机&#xff0c;因为是default exchange 于是来到交换机来看看其他默认的交换机&#xff1a; 这里可以看到默认的交换机是direct&#xff08;应该没…

【Redis】渐进式遍历数据库管理

文章目录 渐进式遍历scan 数据库管理切换数据库清除数据库 获取当前数据库key的个数 渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&…

特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)

特征缩放和转换 您需要应用于数据的最重要的转换之一是功能扩展。除了少数例外&#xff0c;机器学习算法在输入数值属性具有非常不同的尺度时表现不佳。住房数据就是这种情况:房间总数约为6至39320间&#xff0c;而收入中位数仅为0至15间。如果没有任何缩放&#xff0c;大多数…

Axure RP Pro 8 mac/win中文版:打造无限可能的原型设计工具

在如今的数字化时代&#xff0c;原型设计工具越来越受到设计师和产品经理们的重视。而Axure RP Pro8作为一款强大的原型设计工具&#xff0c;成为了众多专业人士的首选。 首先&#xff0c;Axure RP Pro8具备丰富的功能。它提供了多种交互元素和动画效果&#xff0c;使得用户可…